C# を学習する Java 開発者向けのロードマップ
C# と Java には多くの類似点があります。 C# を学習すると、Java でのプログラミングから得た知識の多くを応用できます。
- "同様の構文": Java と C# はどちらも C 言語ファミリに属します。 その類似性は、C# を既に読んで理解できることを意味します。 いくつかの違いがありますが、ほとんどの構文は Java と C と同じです。中かっことセミコロンはおなじみのものです。
if
、else
、switch
などのコントロール ステートメントは同じです。for
、while
、do
...while
のループ ステートメントは同じです。 どちらの言語にもclass
とinterface
の同じキーワードが存在します。public
からprivate
へのアクセス修飾子は同じです。 組み込み型の多くでも、同じキーワード (int
、string
、double
) が使用されています。 - "オブジェクト指向パラダイム": Java と C# はどちらもオブジェクト指向言語です。 ポリモーフィズム、抽象化、カプセル化の概念は、両方の言語に適用されます。 どちらも新しいコンストラクトが追加されましたが、コア機能はまだ関連しています。
- "厳密な型指定": Java と C# はどちらも厳密に型指定された言語です。 変数のデータ型を明示的または暗黙的に宣言します。 コンパイラによってタイプ セーフが強制されます。 コードを実行する前に、コンパイラによってコード内の型関連のエラーがキャッチされます。
- "クロスプラットフォーム": Java と C# はどちらもクロスプラットフォームです。 お好みのプラットフォームで開発ツールを実行できます。 アプリケーションは複数のプラットフォームで実行できます。 開発プラットフォームがターゲット プラットフォームと一致している必要はありません。
- "例外処理": Java と C# はどちらもエラーを示すために例外をスローします。 どちらの場合も、
try
-catch
-finally
ブロックを使用して例外を処理します。 Exception クラスには、同様の名前と継承階層があります。 1 つの違いは、C# には "チェックされた例外" の概念がないことです。 どのメソッドでも (理論上は) 例外をスローする可能性があります。 - "Standard ライブラリ": .NET ランタイムと Java Standard Library (JSL) では、一般的なタスクがサポートされています。 どちらも、他のオープン ソース パッケージの広範なエコシステムを備えています。 C# では、パッケージ マネージャーは NuGet です。 これは Maven に似ています。
- "ガベージ コレクション": どちらの言語も、ガベージ コレクションによる自動メモリ管理を採用しています。 ランタイムは、参照されていないオブジェクトのメモリを再利用します。 1 つの違いは、C# では値の型を
struct
型として作成できることです。
こうした類似性から、C# ではすぐに生産性が向上します。 進むにつれて、Java では使用できない C# の機能やイディオムを学習する必要があります。
- "パターン マッチング": パターン マッチングにより、複雑なデータ構造の形状に基づいた簡潔な条件付きステートメントと式が可能になります。
is
ステートメントは、変数が何らかのパターン "である" かどうかをチェックします。 パターンベースのswitch
式は、変数を検査し、その特性に基づいて決定を行うための豊富な構文を提供します。 - "文字列補間" と "生文字列リテラル": 文字列補間を使用すると、位置識別子を使用するのではなく、評価された式を文字列に挿入できます。 生文字列リテラルは、テキスト内のエスケープ シーケンスを最小限に抑える方法を提供します。
- "null 許容と null 非許容": C# では、型に対して
?
サフィックスを追加することによる "null 許容値型" と "null 許容参照型" がサポートされています。 null 許容型の場合、式の参照値を取得する前にnull
のチェックを行わないと、コンパイラによる警告を受けます。 null 非許容型の場合、その変数にnull
値を割り当てる可能性がある場合、コンパイラから警告が表示されます。 null 非許容参照型は、System.NullReferenceException をスローするプログラミング エラーを最小限に抑えます。 - "拡張メソッド": C# では、クラスまたはインターフェイスを "拡張する" メソッドを作成できます。 拡張メソッドは、ライブラリの型、または特定のインターフェイスを実装するすべての型の動作を拡張します。
- LINQ: 統合言語クエリ (LINQ) には、ストレージに関係なく、データのクエリと変換を行う一般的な構文が用意されています。
- "ローカル関数": C# では、メソッド内またはその他のローカル関数内に関数を入れ子にすることができます。 ローカル関数は、さらに別のカプセル化レイヤーを提供します。
C# には Java にはない機能が他にもあります。 async
や await
などの機能や、非メモリ リソースを自動的に解放する using
ステートメントが表示されます。
C# と Java の間には、微妙だが重要な違いがある同様の機能もいくつかあります。
- "プロパティ" と "インデクサー": プロパティとインデクサー (クラスを配列または辞書のように扱う) には、どちらも言語サポートがあります。 Java では、これらは
get
とset
で始まるメソッドの名前付け規則です。 - "レコード": C# では、レコードは
class
(参照) またはstruct
(値) のいずれかの型になります。 C# レコードは不変にすることができますが、不変である必要はありません。 - "タプル" は C# と Java では構文が異なります。
- "属性" は Java 注釈に似ています。
最後に、C# では使用できない Java 言語機能がいくつかあります。
- "チェックされた例外": C# では、理論的には、どのメソッドでも例外をスローできます。
- "チェックされた配列共変性": C# では、配列は安全に共変しません。 共変構造が必要な場合は、ジェネリック コレクション クラスとインターフェイスを使用する必要があります。
概して、Java の経験がある開発者にとって C# の学習はスムーズに進むはずです。 すぐに生産性を高めるために十分な使い慣れたイディオムが見つかり、新しいイディオムもすぐに習得できます。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET