2014/07/22

CSharper(C#)がJavaに触れて戸惑った4つの仕様

世の中には「Java技術者のためのC#講座」は掃いて捨てるほどあるのに、「C#技術者のためのJava講座」がほとんどない。

私自身、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 件のコメント :

コメントを投稿