JavaとC#の違い
C#を急遽学ばなくなったのでC#に追加されているキーワードを軸にJavaとの違いについてまとめてみた。Javaを知っているプログラマにとっては、ざっと読めばC#の特徴について短期間で学べるのでは無いかと期待する。
尚、C#については熟練しているわけではないので間違っている点があったら指摘していただけるとありがたい。
as
キャストみたいなもの。ただし変換できないとき例外では無くnullを返す。implicit operatorによる暗黙変換を許さない。キャストより高速。
Hoge hoge = fuga as Hoge;
checked
整数型の算術演算および変換に対してオーバーフローチェックを明示的に有効にする。checked( (short)(32767+32767) );で例外出るようになる。
参照
get / set / value
プロパティを定義する。代入や取得時の振る舞いやアクセシビリティを指定できる。
public double Hours { get { return seconds / 3600; } protected set { seconds = value * 3600; } }
out
関数内で値が書き換わりそれが呼び元に反映されることを指定する。
関数定義、呼び元の両方で宣言しなければならい。
static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 }
sizeof
値型を渡しサイズ(バイト数)を返す。参照型には使用できない。
参照
stackalloc
スタックに領域を確保する。
unsafeブロック内で使用する。
static unsafe void Main() { int* fib = stackalloc int[100];
struct
値型を定義できる。
つまり、スタックに確保され、代入のたびにコピーされる。
参照
unchecked
checkedの逆。ただし、デフォルトではuncheckedなためコンパイルオプションでcheckedにした時に明示的にオーバーフロー未チェックであることを指定するために使用する。
参照
unsafe
ブロックやメソッドに指定し、アンセーフコードであることを宣言する。
参照
yield return
戻りIEnumerableの要素を指定する。
public static System.Collections.IEnumerable GetIterator() { yield return "a"; yield return "b"; yield return "c"; }
yield break
yield returnと一緒に使用し、戻りIEnumerableが終わりであることを示す。
public IEnumerator<int> GetItems() { foreach (int item in new int[] { 1, 2, 10 }) { if (item >= 10) yield break; yield return item; } }