トレーニング
ラーニング パス
単純な C# コンソール アプリケーションを作成して実行する (C# の概要、パート 2) - Training
Visual Studio Code を使用して、配列、foreach ループ、および if ステートメントを実装する C# コンソール アプリケーションを開発します。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
この記事では、C# 言語の各メジャー リリースの履歴について説明します。 C# チームは、引き続き新機能を刷新および追加していきます。 今後のリリースに向けて検討される機能を含め、言語機能ステータスについての詳細は GitHub の dotnet/roslyn リポジトリで見つけられます。 特定の機能が言語に追加された時期を確認するには、GitHub の リポジトリにある dotnet/csharplang
ファイルを参照してください。
重要
C# 言語の一部の機能は、C# の仕様で定義されている "標準ライブラリ" の型とメソッドに依存しています。 .NET プラットフォームでは、さまざまなパッケージでそれらの型とメソッドが提供されています。 一例として、例外処理があります。 すべての throw
ステートメントまたは式は、スローされたオブジェクトが Exception から派生していることを確認するために、チェックされます。 同様に、すべての catch
は、キャッチされた型が Exception から派生していることを確認するために、チェックされます。 バージョンごとに新しい要件が追加されている場合があります。 古い環境で言語の最新機能を使用するには、特定のライブラリをインストールする必要がある場合があります。 これらの依存関係については、特定のバージョンごとに用意されたページに記載されています。 この依存関係の経緯と詳細については、言語とライブラリ間の関係に関する記事をご覧ください。
2024 年 11 月リリース
C# 13 には次の新機能があります。
params
コレクション: params
修飾子は配列型に限定されません。
params
、インターフェイス型など、認識された任意のコレクション型で Span<T>
を使用できるようになりました。lock
の型とセマンティクス: lock
ステートメントのターゲットが System.Threading.Lock の場合、コンパイラは、Lock.EnterScope() メソッドを使用して排他的スコープを入力するコードを生成します。 そこから返される ref struct
は、排他スコープを終了する Dispose()
パターンをサポートします。\e
: \e
文字、Unicode ESCAPE
の文字リテラル エスケープ シーケンスとして U+001B
を使用できます。^
) が、オブジェクト初期化子式で許可されるようになりました。ref
ローカルと unsafe
コンテキストを使用できます。ref struct
型を使用して、インターフェイスを実装できます。ref struct
型を許可できます。partial
型で、部分的なプロパティとインデクサーを使用できるようになりました。また、自動的に実装されたプロパティでコンパイラによって生成されたバッキング フィールドにアクセスするための field
コンテキスト キーワードが、プレビュー機能としてリリースされました。
2023 年 11 月リリース
C# 12 では、次の機能が追加されました。
class
または struct
型でプライマリ コンストラクターを作成できます。..e
) を含む、コレクション式を指定する新しい構文。struct
型内で固定サイズの配列を作成できます。ref readonly
パラメーター - ref readonly
ref
パラメーターまたは in
パラメーターを使用している可能性がある API がより明確になります。using
別名ディレクティブを使うと、名前付き型だけでなく、任意の型に別名を設定できます。さらに、インターセプター - プレビュー機能 としてリリースされました。
全体的に、C# 12 は、C# コードを書く際の生産性を向上させる新機能を提供しています。 既に知っている構文が、より多くの場面で使えるようになりました。 その他の構文では、関連する概念の一貫性が有効になります。
2022 年 11 月リリース
C# 11 では、次の機能が追加されました。
Span<char>
定数での string
のパターン マッチnameof
スコープref
フィールドと scoped ref
C# 11 では、"一般的な数学" と、その目標をサポートするいくつかの機能が導入されています。 数値アルゴリズムは、すべての数値型に対して 1 回記述できます。 必要なメンバーや自動既定の構造体など、struct
型の操作を容易にする機能が他にもあります。 未加工の文字列リテラル、文字列補間の改行、UTF-8 文字列リテラルを使用すると、文字列の操作が簡単になります。 ファイル ローカル型などの機能を使用すると、ソース ジェネレーターが単純になります。 最後に、リスト パターンにより、パターン マッチングのサポートが追加されます。
2021 年 11 月リリース
C# 10 によって、C# 言語に次の機能と機能強化が追加されています。
global using
ディレクティブconst
を使用して 文字列を初期化できます。sealed
レコードToString
の型で をオーバーライドするときに 修飾子を追加できます。AsyncMethodBuilder
属性を許可する#line
pragma の新しい形式をサポートしています。その他の機能は "プレビュー" モードで使用することができました。 これらの機能を使用するには、プロジェクトで <LangVersion>
を Preview
に設定する必要があります。
C# 10 では、手続きの削除、アルゴリズムからのデータの分離、.NET ランタイムのパフォーマンスの向上をテーマに引き続き取り組んでいます。
機能が多くなることで、同じ概念を表現するために入力するコードが少なくなります。 "レコード構造体" では、"レコード クラス" が実行するものと同じメソッドの多くが合成されます。 構造体と匿名型では "with 式" がサポートされます。 "グローバルな using ディレクティブ" と "ファイル スコープ名前空間宣言" によって、依存関係と名前空間の編成がより明確に表現されます。 ラムダの機能強化 により、ラムダ式を使用する場所を簡単に宣言できます。 新しいプロパティ パターンと分解の機能強化により、さらに簡潔なコードが作成されます。
新しい補間された文字列ハンドラーと AsyncMethodBuilder
の動作により、パフォーマンスを向上することができます。 これらの言語機能は .NET 6 のパフォーマンス向上を実現するために、.NET ランタイムで適用されました。
また C# 10 では、.NET のリリースに合わせた年次サイクルへのさらなる転換がなされています。 すべての機能を 1 年間の時間枠で完備することはできないため、C# 10 の 2 つの "プレビュー" 機能を試すことができます。 汎用属性 と インターフェイスの静的抽象メンバー の両方を使用できますが、これらはプレビュー機能であり、最終リリース前に変更される可能性があります。
2020 年 11 月リリース
C# 9 は .NET 5 でリリースされました。 これは、.NET 5 リリースを対象とするすべてのアセンブリ用の既定の言語バージョンです。 それには、次の新機能と強化された機能が含まれます。
C# 9 には、以前のリリースから引き続き 3 つのテーマ (手続きの削除、アルゴリズムからのデータの分離、より多くの場所でのより多くのパターンの提供) があります。
上位レベルのステートメントは、メイン プログラムが読みやすくなることを意味します。 必要な手続きが少なくなります。名前空間、Program
クラス、static void Main()
はすべて必要ありません。
records
の導入により、等値の値セマンティクスに従う参照型に簡潔な構文が提供されます。 一般に最小限の動作を定義するデータ コンテナーを定義するには、これらの型を使用します。
init 専用セッターでは、レコードで非破壊的変更 (with
式) を行うための機能が提供されます。 C# 9 では、派生レコードで仮想メソッドをオーバーライドし、基本メソッドの戻り値の型から派生した型を返すことができるように、共変の戻り値の型も追加されます。
パターン マッチング機能は、いくつかの方法で拡張されています。 数値型で "範囲パターン" がサポートされるようになりました。
and
、or
、not
パターンを使用して、パターンを結合できます。 かっこを追加して、複雑なパターンを明確にできます。
C# 9 には、新しいパターン マッチングの機能強化が含まれています。
and
パターン" では、両方のパターンが一致することが要求されますor
パターン" では、どちらかのパターンが一致することが要求されますnot
パターン" では、パターンが一致しないことが要求されますこれらのパターンにより、パターンの構文が豊富になります。 最も一般的な使用方法の 1 つは、null チェックの新しい構文です。
if (e is not null)
{
// ...
}
これらのパターンのいずれも、パターンが許可される任意のコンテキスト (is
パターン式、switch
式、入れ子になったパターン、switch
ステートメントの case
ラベルのパターン) で使用できます。
別の機能セットでは、C# でのハイ パフォーマンス コンピューティングがサポートされています。
nint
および nuint
型により、ターゲット CPU でのネイティブ サイズの整数型がモデル化されます。localsinit
命令を省略して、命令を削減できます。もう 1 つの一連の機能強化では、"コード ジェネレーター" によって機能を追加するシナリオがサポートされています。
C# 9 では、コードの記述と読み取りの両方において、開発者の生産性を向上させる他の小さな機能が多数追加されています。
new
式static
匿名関数GetEnumerator()
ループの拡張機能 foreach
サポートC# 9 のリリースでは、C# を最新の汎用プログラミング言語に保つ作業が続けられています。 最新のワークロードとアプリケーションの種類が引き続き機能によってサポートされます。
2019 年 9 月リリース
C# 8.0 は、特に C# .NET Core をターゲットとする最初のメジャー リリースです。 新しい共通言語ランタイム (CLR) 機能に依存する機能と、.NET Core にのみ追加されたライブラリの型に依存する機能があります。 C# 8.0 では、C# 言語に次の機能と機能強化が追加されています。
既定のインターフェイス メンバーには、CLR の拡張機能が必要です。 これらの機能は、CLR for .NET Core 3.0 で追加されました。 範囲とインデックス、および非同期ストリームには、.NET Core 3.0 ライブラリの新しい型が必要です。 null 許容参照型は、コンパイラに実装されていますが、引数と戻り値の null 状態に関するセマンティック情報を提供する注釈がライブラリに付けられている場合に非常に役立ちます。 このような注釈は .NET Core ライブラリに追加されています。
2018 年 5 月リリース
C# 7.3 リリースには 2 つの主要なテーマがあります。 1 つ目のテーマは、アンセーフ コードと同様のパフォーマンスをセーフ コードで確保するための機能の提供です。 2 つ目のテーマは、既存の機能のインクリメンタルな改善の提供です。 新しいコンパイラ オプションもこのリリースで追加されました。
次の新機能は、セーフ コードのパフォーマンス向上のテーマをサポートします。
ref
ローカル変数を再割り当てできます。stackalloc
配列で初期化子を使用できます。fixed
ステートメントを使用できます。既存の機能が次のように強化されました。
==
と !=
をテストできます。in
によって異なる場合のメソッド解決が改善されました。新しいコンパイラ オプションは次のとおりです。
-publicsign
: オープン ソース ソフトウェア (OSS) のアセンブリの署名を可能にします。-pathmap
: ソース ディレクトリのマッピングを提供します。2017 年 11 月リリース
C# 7.2 では、いくつかの小規模な言語機能が追加されました。
stackalloc
配列の初期化子。fixed
ステートメントを使用できます。ref
ローカル変数を再割り当てすることができます。readonly struct
パラメーターとして渡す必要がある場合は、これを示す in
型を宣言します。in
修飾子を追加し、引数が参照によって渡されるが、呼び出されたメソッドでは変更されないことを指定します。ref readonly
修飾子を使用し、メソッドが参照によってその値を戻しますが、そのオブジェクトに対する書き込みを許可しないことを指定します。ref struct
型を宣言します。private protected
アクセス修飾子: private protected
アクセス修飾子によって、同じアセンブリ内の派生クラスのアクセスが有効になります。ref
式: ?:
) の結果を参照にすることができるようになりました。2017 年 8 月リリース
C# は、C#7.1 で "ポイント リリース" のリリースを開始しました。 このバージョンでは、言語バージョン選択構成要素、3 つの新しい言語機能、新しいコンパイラ動作が追加されます。
このリリースの新しい言語機能は次のとおりです。
async
Main
メソッド
async
修飾子を設定できます。default
リテラル式
最後に、コンパイラには、参照アセンブリ生成を制御する 2 つのオプション、-refout
と -refonly
があります。
2017 年 3 月リリース
C# バージョン 7.0 は、Visual Studio 2017 でリリースされました。 このバージョンには、C# 6.0 から続くいくつかの革新的で優れた機能があります。 新機能の一部を次に示します。
その他の機能:
これらの機能はすべて、開発者に新機能を提供し、これまでよりもクリーンなコードを記述する機会を提供します。 ハイライトは、out
キーワードで使用するために変数の宣言を凝縮することと、タプルを通じて複数の戻り値を許可することです。 .NET Core は現在、任意のオペレーティング システムを対象としており、クラウドと移植性をしっかりと見据えています。 この言語の設計者たちは、新機能を考え出すことに加え、こうした新たな能力についても多くの思考と時間を費やしています。
2015 年 7 月リリース
Visual Studio 2015 でリリースされたバージョン 6.0 では、C# プログラミングの生産性を向上させる多数の小さな機能がリリースされました。 その一部を次に示します。
その他に次の新機能があります。
これらの機能を全体的に見ると、興味深いパターンが見えてきます。 このバージョンで、コードをより簡潔で読みやすくするため、C# から定型表現が排除され始めました。 そのため、クリーンで単純なコードが好きな人に、この言語バージョンは大当たりしました。
マイクロソフトはこのバージョンとともにもう 1 つ別のことを行いましたが、それ自体が従来の言語機能ではありませんでした。 サービスとしてのコンパイラ Roslyn をリリースしたのです。 C# コンパイラは現在、C# で記述され、プログラミングのための取り組みの一環として、コンパイラを使用することができます。
2012 年 8 月リリース
Visual Studio 2012 でリリースされた C# バージョン 5.0 は、この言語の専心的なバージョンでした。 このバージョンに対するほぼすべての努力が、非同期プログラミングの async
および await
モデルというもう一つの革新的な言語の概念に注がれました。 主要な機能の一覧を次に示します。
呼び出し元情報属性を使用すると、さまざまな定型リフレクション コードを使用しなくても、実行しているコンテキストに関する情報を簡単に取得できます。 診断とログ記録のタスクでは、さまざまな用途があります。
しかしこのリリースの真の主役は、async
と await
です。 2012 年にこれらの機能が登場したとき、C# はファーストクラスの一部として非同期を言語に採用したことで再び流れを変えました。
2010 年 4 月リリース
C# バージョン 4.0 は Visual Studio 2010 と共にリリースされ、いくつかの興味深い新機能が導入されました。
埋め込まれた相互運用機能型により、アプリケーション用に COM 相互運用アセンブリを作成する展開の苦労が軽減されました。 ジェネリックの共変性と反変性は、ジェネリックを使用する権限を強化しますが、少々アカデミックで、最も高く評価されているのは、おそらくフレームワークとライブラリの作成者からでしょう。 名前付きパラメーターと省略可能なパラメーターは、多くのメソッドのオーバーロードを排除して、利便性を高めることができます。 しかし、これらの機能はいずれもパラダイムを変えるほどのものではありませんでした。
主要な機能は、dynamic
キーワードの導入でした。 C# バージョン 4.0 で導入された dynamic
キーワードにより、コンパイル時の型指定でコンパイラをオーバーライドできるようになりました。 dynamic キーワードを使用することで、JavaScript のような動的に型指定された言語と同様のコンストラクトを作成することができます。
dynamic x = "a string"
を作成してから、それに 6 を追加して、実行時までそのままにして次に発生する必要のあることを整理することができます。
動的バインドには潜在的なエラーの可能性がありますが、同時に、この言語が持つ大きな力にもなっています。
2007 年 11 月リリース
C# バージョン 3.0 は、Visual Studio 2008 と共に 2007 年後半に登場しましたが、すべての言語機能が搭載されたのは、実際には .NET Framework バージョン 3.5 からでした。 このバージョンは、C# の成長において大きな変化を遂げました。 このバージョンで、C# は真に強力なプログラミング言語としての地位を確立しました。 このバージョンでの主な機能をいくつか見てみましょう。
今になって考えると、これらの機能の多くは必然で切り離せないものに思えます。 これらすべてが戦略的に組み合わさっています。 C# のこのバージョンでの目玉機能はクエリ式 (別名、統合言語クエリ、LINQ) でした。
もう少し異なる見解では、式ツリー、ラムダ式、匿名型が、LINQ が構築される基になっていると分析しています。 しかし、いずれにしても、C# 3.0 は革新的な概念を提示しました。 C# 3.0 が、C# をオブジェクト指向と関数型言語のハイブリッドに変換するための下準備を始めました。
いろいろありますが、特に、今では記述できるようになった SQL スタイル、コレクションに対して操作を実行する宣言型クエリなどがあります。
for
ループを記述して整数のリストの平均を計算する代わりに、今では単純に list.Average()
でこれを行うことができます。 クエリ式と拡張メソッドの組み合わせにより、整数のリストが非常にスマートになりました。
2005 年 11 月リリース
Visual Studio 2005 と共に 2005 年にリリースされた C# 2.0 の主な機能をいくつか見てみましょう。
その他の C# 2.0 機能では既存の機能に新たな能力を追加しました。
C# は汎用的なオブジェクト指向 (OO) 言語として始まりましたが、C# バージョン 2.0 ではそれが急速に変化しました。 ジェネリックでは、型とメソッドがタイプ セーフを維持しながら任意の型に対して操作を行えます。 たとえば、List<T> があると、List<string>
または List<int>
を使用し、これらの文字列または整数に対してタイプ セーフ操作を実行しながら、これらを反復処理することができます。 ジェネリックを使用する方が、ListInt
から派生する ArrayList
型を作成したり、すべての操作で Object
からキャストしたりするよりも優れています。
C# バージョン 2.0 で、反復子が導入されました。 手短に言うと、反復子を使用すると、List
内のすべての項目 (またはその他の列挙可能な型) を foreach
ループで確認することができます。 反復子を言語のファーストクラスの部分として持つことで、言語の読みやすさと、ユーザーのコードについて推論する能力が劇的に高まりました。
2003 年 4 月リリース
Visual Studio .NET 2003 に付属の C# バージョン 1.2。 言語に対する細かな機能強化がいくつか含まれています。 最も重要な点は、このバージョン以降、foreach
によって Dispose が実装された場合、IEnumerator ループ内で生成されたコードでは、その IEnumerator 上で IDisposable が呼び出されているということです。
2002 年 1 月リリース
振り返ってみると、Visual Studio .NET 2002 でリリースされた C# バージョン 1.0 は Java に似ていました。 ECMA で掲げられた設計目標の一環として、C# は "シンプルかつモダンな汎用オブジェクト指向言語" を目指していました。当時、Java に似ていることは、初期の設計目標を達成したことを意味していました。
しかし、今 C# 1.0 を振り返ってみると、少し混乱するかもしれません。 現在では当たり前となっている組み込みの非同期機能や、ジェネリック関連の優れた機能の一部は備わっていませんでした。 実際、ジェネリック全体がなかったのです。 そして LINQ も、 まだ使用できませんでした。 このような追加機能が登場するまでにはまだ数年かかります。
C# バージョン 1.0 は、現在のバージョンと比べると、機能がはぎ取られたように見えます。 気がつくと冗長なコードを記述している場合があるでしょう。 しかしそれでも、千里の道も一歩からです。 C# バージョン 1.0 は、Windows プラットフォームにおける Java の実行可能な代替手段でした。
C# 1.0 の主な機能:
記事は、NDepend ブログで元々公開されていたものです (提供: Erik Dietrich および Patrick Smacchia)。
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。
トレーニング
ラーニング パス
単純な C# コンソール アプリケーションを作成して実行する (C# の概要、パート 2) - Training
Visual Studio Code を使用して、配列、foreach ループ、および if ステートメントを実装する C# コンソール アプリケーションを開発します。