C SharpとJavaの比較
言語 > 表記法と特殊な仕様 > キーワード

| キーワード | 仕様・使用例 |
| --- | --- |
get, set: C#では、Javaにおけるアクセサメソッドへの代替としてプロパティを言語構文としてサポートする。 public class Person {     private string _name;     public string Name {         // C# 6.0 以降の式形式プロパティ構文。         get => _name;         set => _name = value;     } } 
in, out, ref, ref readonly: C#ではメソッド引数をoutまたはrefで修飾することで、引数への出力あるいは参照をサポートする。これによって複数の戻り値を得たり、参照渡ししたりするといったことが可能になる。 C# 7.0以降ではさらにメソッドの戻り値をref修飾して参照とすることができ、ref修飾されたローカル変数でその参照を受け取ることができる。 C# 7.2以降では、構造体型がマネージド メモリに直接アクセスし、常にスタック割り当てが必要であることを示すために、構造体の型定義をref修飾することで「ref構造体（ref struct）」を宣言することができる。C# 11以降では、さらにref構造体のフィールドにref修飾した「refフィールド」を宣言することができる。 C# 7.2以降では、参照渡しではあるもののメソッド内での再代入による割り当て（構造体の場合はフィールドやプロパティの書き換えも含む）を禁止するin引数修飾子がサポートされるようになった。in引数を参照ローカル変数で受け取ったり参照戻り値で返したりする場合はref readonlyで修飾する。ただしreadonlyでない構造体の場合は参照渡しとならず、暗黙的なコピーが発生する。C# 12以降では、読み取り専用ではあるものの左辺値のみを想定し、右辺値を想定しないことを示す（リテラルや一時変数のような右辺値を渡すと警告を出す）ref readonly引数修飾子がサポートされるようになった。
switch: C#ではswitch文で整数型、char型、bool型、列挙型、それらの型のNullable、およびstring型を使うことができる。C#ではフォールスルーを許可しない（caseラベルが連続している場合のみ許可される）。C# 7.0以降では、さらに「型パターン」により型ベースの分岐が可能である。 また、C# 8.0以降では、ステートメントではなく式としてパターンマッチの評価が可能な「switch式」も追加された。 C#のswitch式のコード例 enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } // C# の switch 式。 var day = Day.Wednesday; int numLetters = day switch {     Day.Monday or Day.Friday or Day.Sunday => 6,     Day.Tuesday => 7,     Day.Thursday or Day.Saturday => 8,     Day.Wednesday => 9,     _ => throw new InvalidOperationException($"Invalid day: {day}") };   Javaではint/short/byte/char型およびそれらのプリミティブラッパークラスを使うことができるが、long/boolean型を使うことはできない。Java 1.5では列挙型を、Java 7ではString型を使えるようになったが、C#と違ってcaseラベルにnullを使うことはできない。Javaではフォールスルーを許可する。 Java 14以降は「switch式」が追加されたが、C#のswitch式とは構文はやや異なる。従来のcase XXX:ラベルと新設のyield文を使った書き方も可能となっている。 Javaのswitch式のコード例 enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } // Java の switch 式。 var day = Day.WEDNESDAY; int numLetters = switch (day) {     case MONDAY, FRIDAY, SUNDAY -> 6;     case TUESDAY -> 7;     case THURSDAY, SATURDAY -> 8;     case WEDNESDAY -> 9;     default -> throw new IllegalStateException("Invalid day: " + day); };  
strictfp: Java SE 1.2からJava SE 16までは、異なるプラットフォーム間で浮動小数点数の演算結果が同じになるよう保証するstrictfpキーワードを利用できた。
checked, unchecked: C#では、checkedブロック内（あるいは式単体）では実行時に整数型の算術オーバーフローがチェックされる。
using, try: C#では、usingステートメントによって、作成されたオブジェクトがブロックを抜ける際に確実に破棄されるよう強制することができる。C# 8.0以降はブロックの明示的な記述を必要としないusing宣言もサポートする。 // "test.txt"というファイルを作成し、文字列を書き込み、（例え例外が発生しても）確実に閉じる。 using (StreamWriter file = new StreamWriter("test.txt")) {     file.Write("test"); }  Java 7では、try-with-resources構文で同様のリソース解放に対応している。
goto: C#ではgoto文がサポートされる。これは便利な場面もあるが、通常はより構造化されたフロー制御方法が推奨される。C#ではswitchステートメントにおいてgotoキーワードを使うことで、異なるcaseラベルに移ることができる。 Console.Write("Color is "); switch (color) {     case Color.Blue: Console.Write("blue"); break;     case Color.DarkBlue: Console.Write("dark "); goto case Color.Blue;     case Color.LightBlue: Console.Write("light "); goto case Color.Blue;     // ...     default: Console.Write("unknown"); break; } Console.WriteLine();  Javaではgoto文はサポートされない。ただしgotoは予約されており、識別子として利用できない。代わりに制限されたgotoとして、ラベル付きbreak文/continue文を使うことができる。これにより多重ループの脱出などを簡潔に記述できる。
yield: C# 2.0以降ではコンテキストキーワードyieldが用意されており、yield return文とyield break文を使用してイテレータ（コルーチン）を記述できる。これらの文を含むメソッド（イテレータ）の戻り値はIEnumerableインターフェイス、またはIEnumeratorインターフェイスでなければならない。 また、イテレータは、内部的に状態を持つステートマシンとしてコンパイルされ、値を部分的に返却する列挙子を提供するように振る舞う。 // 指定された個数の乱数を生成する public IEnumerable<int> RandomValueGenerator(int count) {     var r = new Random();     for (int index = 0; index < count; ++index) {         yield return r.Next();     } }  .NET Core 3.0およびC# 8.0以降では、IAsyncEnumerableインターフェイスを返す非同期メソッドの中でyield return await文を使用でき、await foreach文によって非同期ストリームを処理できる。 Javaには言語構文レベルでのコルーチンのサポートはない。前述のように、Java 14で追加されたyield文は、switch式における糖衣構文で使用されるものにとどまっている。
async, await: C# 5.0以降ではコンテキストキーワードasync/awaitを用いて非同期処理を同期処理風に記述することが可能である。
unsafe, fixed: C#ではunsafeキーワードを用いることで、ポインタや関数ポインタ、固定サイズバッファを利用可能なunsafeコンテキストを宣言することができる。unsafeコンテキスト内ではfixedステートメントを使うことで、ガベージコレクタのメモリコンパクションによる変数の再配置を抑制し、オブジェクトのアドレスを固定（ピン留め）してポインタを取得することもできる。