私自身、C#をメイン言語として仕事をしてきた。
Javaは学生の頃、プログラミングの必修科目で触っただけで思い入れもなにもない。
そんなCSharperが会社の命令により、Javaを勉強することになった。
そのときに戸惑った4つの仕様をまとめる。
nullの結合
// C#
string x = "abc";
strign y = null;
// 出力:abc
Console.WriteLine(x + y);
// Java
String x = "abc";
String y = null;
// 出力:abcnull
System.out.println(x + y);
まず最初に躓いたのが、「null」の扱い。C#で「null」といえば、本当の意味での「null(何もない)」を指す。
しかし、Javaは「null」を文字列として扱ってしまう。
そのため、文字列結合をすると「null」という文字列がくっついてしまう。
おそらく「ぬるぽ(NullPointerException)」が世間一般に広まった原因が、このnullの扱い方のせいではないだろうか?
多次元配列
// C#
int[,] intArray = new int[,];
// Java
int[][] intArray = new int[][];
C#では、多次元配列のインスタンスを作成できるが、Javaでは作成できない。Javaは「配列の配列」として多次元配列を表現する。
C#でいうところのジャグ配列にあたる。
アクセス修飾子の「指定なし」
// C#
class CSharpClass
{
//private string MemberVariableと同じ
string MemberVariable;
}
// Java
class JavaClass
{
// 同一パッケージ内でprivate
String MemberVariable;
}
C#の「アクセス修飾子なし」はprivateと同一。同一名前空間でも、同一アッセンブリからでも自身のclassなりを抜けるとアクセスできなくなる。一方、Javaの「アクセス修飾子なし」は"同一パッケージ内で"privateになる。
普通に使う分にはそこまで影響がないかもしれないが、気持ち悪い。
usingとimport
// C#
using System.IO;
StreamReader sr = new StreamReader(@"C:\work\folder");
// Java
import java.io;
FileInputStream fs = new FileInputStream("C:\work\folder");
似ているようでちょっと違う。C#の場合は、usingと書いただけではコンパイラが「System.IOってどこにあんねん!」って怒る。
そのため、「参照設定」などでdllを読み込む必要がある。
Javaの場合は、Importと書くと「java.io」がどこにあるかわかる。(物理階層のため)
そのため、「参照設定」とかなくてもコンパイルできる。
個人的には、usingの方が好き。dllを「bin」フォルダに全てまとめておけるもん。
この辺りは、勉強不足なのでもうちょっと深く学びたい。
ちなみにC#の「namespace」とJavaの「package」は同じ意味。
やっぱり C# が好き
C#は後発なだけあって、スマートになっている。
Javaの面倒臭い部分を改良し、さらに便利な機能を追加したものがC#!
そもそも冒頭で述べたように「Java技術者のためのC#講座」が多いのに、「C#技術者のためのJava講座」が少ないのも、「C#」のほうが良いという表れではないだろうか?
こういうことを書くとJavaerに怒られそうだけど(笑)
直近の仕事ではJavaは使わないが、どうやら(機密情報)のためJavaをいやいや勉強するのであった。
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿