JavaとC#の違い

C#を急遽学ばなくなったのでC#に追加されているキーワードを軸にJavaとの違いについてまとめてみた。Javaを知っているプログラマにとっては、ざっと読めばC#の特徴について短期間で学べるのでは無いかと期待する。
尚、C#については熟練しているわけではないので間違っている点があったら指摘していただけるとありがたい。

as

キャストみたいなもの。ただし変換できないとき例外では無くnullを返す。implicit operatorによる暗黙変換を許さない。キャストより高速。

Hoge hoge = fuga as Hoge;

参照

checked

整数型の算術演算および変換に対してオーバーフローチェックを明示的に有効にする。checked( (short)(32767+32767) );で例外出るようになる。
参照

decimal

128ビットのデータ型。浮動小数点型(double)よりも正確な計算ができる。
参照

delegate

メソッド型
参照

event

登録されたdelegate(イベントハンドラ)をコールする。
delegate型を指定して作成する。
複数のイベントハンドラを登録できる。
参照

explicit

コンストラクタに指定し、それがキャストでの変換処理で使用できることを宣言する。
参照

implicit

コンストラクタに指定し、それが暗黙変換に使用できることを宣言する。
explicitと違いキャストすら要らなくなる。
参照

fixed

ポインタがGCで移動してはならないことを指定する。unsafeメソッドにポインタを渡す時などに使用する。
参照

get / set / value

プロパティを定義する。代入や取得時の振る舞いやアクセシビリティを指定できる。

    public double Hours
    {
        get { return seconds / 3600; }
        protected set { seconds = value * 3600; }
    }

参照

foreach / in

Javaのfor
参照

operator

クラスに対する演算子を定義する。

    public static Hoge operator +(Hoge a, Hoge b) {
		// ...
	}

参照

out

関数内で値が書き換わりそれが呼び元に反映されることを指定する。
関数定義、呼び元の両方で宣言しなければならい。

    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }

参照

virtual

基底クラスのメソッドに指定し、オーバーライド可能であることを示す。Javaと違いC#ではデフォルトオーバーライド不可である。

override

C#Javaと違いデフォルトでオーバーライドしない。そのため、overrideキーワードでオーバーライドしていることを明示する必要がある。
参照

new

メソッドに指定し、基底クラスのメソッドを隠す。コンパイル時にレシーバの型によって呼ばれるメソッドが決まる点でoverrideと動作が異なる。
参照

partial

C#ではクラス定義をpartialを指定することで複数ファイルに分けることができる。
参照

readonly

フィールドに修飾子として指定し、そのフィールドがコンストラクタでのみ代入されることを宣言する。
参照

ref

outと同じ(実行時は)。コンパイル時にrefは変数が初期化されているかどうかをチェックする。
参照

sizeof

値型を渡しサイズ(バイト数)を返す。参照型には使用できない。
参照

stackalloc

スタックに領域を確保する。
unsafeブロック内で使用する。

    static unsafe void Main()
    {
        int* fib = stackalloc int[100];

参照

string

System.Stringのエイリアス
==や!=で中身の比較がされる。+で連結される。
参照

struct

値型を定義できる。
つまり、スタックに確保され、代入のたびにコピーされる。
参照

typeof

型の System.Type オブジェクトを取得する。

	System.Type type = typeof(int);

参照

unchecked

checkedの逆。ただし、デフォルトではuncheckedなためコンパイルオプションでcheckedにした時に明示的にオーバーフロー未チェックであることを指定するために使用する。
参照

unsafe

ブロックやメソッドに指定し、アンセーフコードであることを宣言する。
参照

where

ジェネリックの型指定の制約を指定する。ジェネリックの型にのみ指定できるという点以外Javaのextendsと一緒。
参照

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;
    }
  }

参照