(Translated by https://www.hiragana.jp/)
C Sharp - Wikipedia コンテンツにスキップ

C Sharp

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
C sharpから転送てんそう
C#
C#
C#のロゴ
パラダイム 構造こうぞうプログラミング命令めいれいがたプログラミングオブジェクト指向しこうプログラミングイベント駆動くどうがたプログラミング関数かんすうがたプログラミングジェネリックプログラミングリフレクションクラスベース正格せいかくプログラミング、マルチパラダイムプログラミング ウィキデータを編集
登場とうじょう時期じき 2000ねん (24ねんまえ) (2000)
設計せっけいしゃ マイクロソフトアンダース・ヘルスバーグひきいるチーム)
開発かいはつしゃ マイクロソフト ウィキデータを編集
最新さいしんリリース 12.0/ 2023ねん11月14にち (10かげつまえ) (2023-11-14)[1]
型付かたつ つよ静的せいてき型付かたつ(4.0から動的どうてきがた導入どうにゅう
おも処理しょりけい CLR, Mono
影響えいきょうけた言語げんご C++C言語げんごJava、Delphi、Modula-3CωおめがEiffelF SharpHaskellIconJ SharpMicrosoft Visual J++Object PascalRustMLVisual Basic ウィキデータを編集
影響えいきょうあたえた言語げんご D言語げんご, F#, Java, Nemerle, Vala, TypeScript
プラットフォーム Windows, macOS, Linuxなど
ライセンス Apacheライセンス (Roslyn)
ウェブサイト docs.microsoft.com/ja-jp/dotnet/csharp/ ウィキデータを編集
拡張子かくちょうし cs、csx ウィキデータを編集
テンプレートを表示ひょうじ

C#(シーシャープ)は、マイクロソフト開発かいはつした、汎用はんようマルチパラダイムプログラミング言語げんごである。C#は、Javaに構文こうぶんち、C++くらべてあつかいやすく、プログラムの記述きじゅつりょうすくなくてむ。また、C#は、Windowsの.NET Frameworkうえ動作どうさすることを前提ぜんていとして開発かいはつされた言語げんごであるが、2023ねん現在げんざいクロスプラットフォーム.NETランタイムじょう動作どうさする。

デスクトップモバイルふくむアプリケーション開発かいはつや、ASP.NETをはじめとするWebサービスの開発かいはつフレームワーク、ゲームエンジンUnityでの採用さいよう事例じれいなどもある。

マルチパラダイムをサポートする汎用はんようだかレベルプログラミング言語げんごで、静的せいてき型付かたつタイプセーフスコープ命令めいれいがた宣言せんげんがた関数かんすうがた汎用はんようがたオブジェクト指向しこうクラスベース)、コンポーネント指向しこうのプログラミング分野ぶんやふくんでいる。

共通きょうつう言語げんご基盤きばん (CLI) といった周辺しゅうへん技術ぎじゅつふくめ、マイクロソフトのフレームワークである「.NET」一部いちぶである。また、以前いぜんVisual J++で「互換ごかんなJava」をJavaにもうとしたマイクロソフトとはことなり、そのおおくの[注釈ちゅうしゃく 1]仕様しよう積極せっきょくてき公開こうかいし、標準ひょうじゅん機構きこうたくして自由じゆう利用りようゆるす (ECMA-334,ISO/IEC 23270:2003,JIS X 3015) など、同社どうしゃ姿勢しせい変化へんかがあらわれている。

設計せっけいはデンマークのアンダース・ヘルスバーグによる。

構文こうぶんはCけい言語げんご(C,C++など)の影響えいきょうけており、その要素ようそには以前いぜんヘルスバーグ所属しょぞくしていたボーランド設計せっけいDelphi影響えいきょう見受みうけられる。また、主要しゅよう言語げんごへのasync/await構文こうぶんや、ヘルスバーグが言語げんご設計せっけいかかわるTypeScriptでのジェネリクス採用さいようなど、言語げんごへの影響えいきょうられる。

概要がいよう

[編集へんしゅう]

開発かいはつにはボーランドのTurbo PascalDelphi開発かいはつしたアンダース・ヘルスバーグ筆頭ひっとうとして多数たすうのDelphi開発かいはつじん参加さんかしている。

C#は共通きょうつう言語げんご基盤きばん共通きょうつう言語げんごランタイムなど)が解釈かいしゃくする共通きょうつうちゅうあいだ言語げんごコンパイルされて実行じっこうされる。

自動じどうボックスデリゲートプロパティインデクサカスタム属性ぞくせいポインタ演算えんざん操作そうさ構造こうぞうたいがたオブジェクト)、多次元たじげん配列はいれつ可変長かへんちょう引数ひきすうasync/await構文こうぶんnull安全あんぜん、などの機能きのうつ。また、Javaと同様どうようだい規模きぼライブラリプロセッサ・アーキテクチャ依存いぞんしない実行じっこう形態けいたいガベージコレクションJITコンパイルによる実行じっこう高速こうそくAOTコンパイラによる高速こうそく実行じっこう、などが実現じつげんされている(もっともこれらはC#の機能きのうというより.NET によるものである)。

.NET構想こうそうにおける中心ちゅうしんてき開発かいはつ言語げんごであり、XML WebサービスASP.NET記述きじゅつにも使用しようされる。の.NETけい言語げんごでも記述きじゅつ可能かのうだが、.NET APIはC#からの利用りようだいいち想定そうていされており、の.NETけい言語げんごとくに2023ねん以降いこうしん構文こうぶん追加ついかなしと宣言せんげんされたVB.NET[3])では利用りようできない、あるいは将来しょうらいてき利用りようできなくなる機能きのう存在そんざいする。

マイクロソフトの統合とうごう開発かいはつ環境かんきょう(Microsoft Visual Studio)では、Microsoft Visual C#がC#に対応たいおうしている。また、Visual Studio Code専用せんようのC#拡張かくちょう(C# DevKit)を導入どうにゅうすることでクロスプラットフォームで開発かいはつすることが可能かのう[4]

共通きょうつう言語げんご仕様しようのCLSによって、のCLS準拠じゅんきょ言語げんごF#Visual Basic .NETVisual C++ (C++/CLI) など)と相互そうご連携れんけいすることができる。

バージョンおよびリリース時期じき

[編集へんしゅう]
バージョン 言語げんご仕様しよう リリース時期じき .NET Visual Studio
ECMA[5][6] ISO/IEC マイクロソフト
1.0

ECMA-334:2003 (2002ねん12がつ)

ISO/IEC 23270:2003 (2003ねん4がつ)

2002ねん1がつ 2002ねん1がつ .NET Framework 1.0 .NET (2002)[a 1]
2003ねん10がつ 2003ねん4がつ .NET Framework 1.1[b 1] .NET 2003[a 1][b 1]
2.0

ECMA-334:2006 (2006ねん6がつ)

ISO/IEC 23270:2006 (2006ねん9がつ)

2005ねん9がつ 2005ねん11月
  • .NET Framework 2.0[b 2]
  • .NET Framework 3.0
2005[a 1]
3.0 2007ねん8がつ 2007ねん11月
2008[a 1]
4.0 2010ねん4がつ 2010ねん4がつ .NET Framework 4[b 3] 2010[a 1]
5.0

ECMA-334:2017 (2017ねん12がつ)

ISO/IEC 23270:2018 (2018ねん12がつ)

2013ねん6がつ 2012ねん8がつ .NET Framework 4.5[b 4]
6.0

ECMA-334:2022 (2022ねん6がつ)

Draft 2015ねん7がつ
  • .NET Framework 4.6[8]
  • .NET Core 1.0
  • .NET Core 1.1
2015[a 1]
7.0

ECMA-334:2023 (2023ねん12がつ)

ISO/IEC 20619:2023 (2023ねん9がつ)

2017ねん3がつ .NET Framework 4.7[9] 2017 version 15.0[a 2]
7.1 2017ねん8がつ .NET Core 2.0[a 1] 2017 version 15.3[a 3]
7.2 2017ねん11月 .NET Core 2.0[a 1] 2017 version 15.5[a 4]
7.3 2018ねん5がつ
  • .NET Core 2.1[b 5]
  • .NET Core 2.2
  • .NET Framework 4.8
2017 version 15.7[a 5]
8.0 2019ねん9がつ
  • .NET Core 3.0[10]
  • .NET Core 3.1
2019 version 16.3[a 6]
9.0 2020ねん11月 .NET 5.0[11] 2019 version 16.8[a 7]
10.0[a 8] Proposal 2021ねん12月
  • .NET 6.0
  • .NET 6.0.1
2022 version 17.0[a 9]
11.0[a 10][b 6] C# feature specifications 2022ねん11月[a 11][b 6] .NET 7.0[a 11][b 6] 2022 version 17.4[a 11][a 12][b 6]
12.0[a 13][b 7] C# feature specifications 2023ねん11月[a 14][b 7] .NET 8.0[a 14][b 7] 2022 version 17.8[a 14][a 15]

言語げんご仕様しよう

[編集へんしゅう]

さまざまな意味いみにおいて、基盤きばんであるCLI機能きのうをもっとも反映はんえいしている言語げんごであるといえる。C#にあるがたのほとんどは、CLIフレームワークに実装じっそうされているがた対応たいおうしている。

しかし、C#の言語げんご仕様しようはコンパイラのコード生成せいせいについてはなに言及げんきゅうしていないため、CLR対応たいおうしなければならないとか、共通きょうつうちゅうあいだ言語げんご (CIL) などの特定とくていのフォーマットのコードを生成せいせいしなければならないとかいうことはべられていない。

そのため、理論りろんてきにはC++FORTRANのように環境かんきょう依存いぞんのマシン生成せいせいすることも可能かのうである。しかし、現在げんざい存在そんざいするすべてのC#コンパイラはCLIをターゲットにしている。

.NET 7.0以降いこう可能かのうになった事前じぜんコンパイルの一種いっしゅである「Native AOT」でデプロイすることで実行じっこう可能かのう環境かんきょう依存いぞんのバイナリを出力しゅつりょくすることが可能かのうである。しかしながらこの手法しゅほうもCLIとランタイムを事前じぜんかくアーキテクチャけのバイナリに変換へんかんしているだけであり、CLIを経由けいゆすることにわりはない。[12]

特殊とくしゅれいとしては、UnityのScripting Backendである「IL2CPP[13]や「Burst」[14]がある。 IL2CPPはC#をコンパイルしたCILをさらにC++コードへと変換へんかん、ネイティブバイナリへC++コンパイラによってコンパイルされる。BurstはC#をコンパイルしたCILをLLVMコンパイラによってネイティブバイナリへコンパイルするものである。

C#のHello World以下いかとおりである[15]。1ぎょうでの記述きじゅつ可能かのう

Console.WriteLine("Hello World!");

あえて冗長じょうちょう記載きさいすると下記かきようになる。

using System;

namespace Wikipedia
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

このコードは問題もんだいなくコンパイルがとおるが、以下いかのような冗長じょうちょう記述きじゅつふくまれる。

  • 不要ふようusing [16]
  • 省略しょうりゃく可能かのうnamespace("Wikipedia")の宣言せんげん [17]
  • 省略しょうりゃく可能かのうclass("Program")の宣言せんげん [17]
  • 省略しょうりゃく可能かのうエントリーポイント関数かんすう(Main)の宣言せんげん [17]

CやC++からの改良かいりょうてん

[編集へんしゅう]

C#では、CやC++と比較ひかくしてさまざまな制限せいげん改良かいりょうくわえられている。また、仕様しようおおくはC#言語げんごというよりは、基盤きばんである .NET そのものに依拠いきょしている。Javaで導入どうにゅうされた制限せいげんおよび改良かいりょうをC#でも同様どうよう採用さいようしているものがおおいが、C#であらたに導入どうにゅうされた改良かいりょうがのちにJavaにも同様どうよう採用さいようされたものもある。そのれいつぎげる。

構文こうぶん構文こうぶん以外いがい改良かいりょうてん

[編集へんしゅう]
  • そとのブロックで宣言せんげんした変数へんすうおな名前なまえ変数へんすうを、うちのブロックでさい宣言せんげん(シャドウ)してはいけない。さい宣言せんげん便利べんりなこともあれば、混乱こんらん曖昧あいまいのもとと主張しゅちょうされることもあるが、C#では禁止きんしされている。
  • C#にはブールがたbool存在そんざいし、whileぶんifぶんのように条件じょうけんをとるステートメントには、boolかたしきあたえなければならない。C言語げんごでは、ブールがたintかた(0をにせとし、0をしんとする)に兼用けんようさせたうえ、(ヌルポインタにせとみなすこととするといろいろと便利べんりだった、ということもあり)ポインタでもwhileぶんifぶんあたえるしきにできる、という仕様しようとしていた。これは便利べんりなこともあったが、本来ほんらい比較ひかくしき記述きじゅつすべきところであやまって代入だいにゅうしき記述きじゅつしてもコンパイル適合てきごうとなってしまうなど、ミスが見逃みのがされることもあった。C#ではミスを防止ぼうしするため[よう出典しゅってん]に、そのような仕様しようではなくブールがた独立どくりつさせ、またブールがた厳密げんみつ要求ようきゅうする場所ばしょおおくしている。
  • switchぶん整数せいすうがたあるいは整数せいすうがたじゅんずるかたのみならず、文字もじれつがたstring使用しようできる。caseラベルには、整数せいすうがたあるいは整数せいすうがたじゅんずるかた定数ていすうのみならず、文字もじれつリテラル(文字もじれつ定数ていすう)を使用しようできる。
    • C# 7.0 以降いこうでは caseラベルに複雑ふくざつパターンマッチングおこなうことが可能かのう複雑ふくざつ判定はんてい簡易かんい記述きじゅつ記載きさい可能かのう[b 8]
  • がたのサイズおよび内部ないぶ表現ひょうげん仕様しようさだめられており、プラットフォームや処理しょりけい依存いぞんしない。浮動ふどう小数点しょうすうてんすうIEEE 754準拠じゅんきょする[a 16]文字もじおよび文字もじれつUTF-16エンコーディングを採用さいようする[a 17]
    • C# 9.0以降いこうでは CPUによってサイズのことなる整数せいすうがた nint/nuint追加ついかされた [b 9]
    • C# 11.0 以降いこうでは文字もじれつUTF-8としてあつかう「UTF-8文字もじれつリテラル」が追加ついかされた[18]

ポインタとメモリ管理かんり

[編集へんしゅう]
  • ポインタをサポートする。ポインタはunsafeスコープないのみで使用しようすることができ、適切てきせつ権限けんげんをもつプログラムのみがunsafeとマークされたコードを実行じっこうすることができる。オブジェクトへのアクセスのだい部分ぶぶん管理かんりされた安全あんぜん参照さんしょうによってなされ、だい部分ぶぶん算術さんじゅつ演算えんざんはオーバフローのチェックがなされる。unsafeポインタはがた文字もじれつすことができる。セーフコードでは、かならずしもそうする必要ひつようはないものの、IntPtrかたとおしてポインタをやりとりすることができる。
  • マネージドなメモリを明示めいじてき解放かいほうする方法ほうほう存在そんざいせず、参照さんしょうされなくなったメモリはガベージコレクタによって自動的じどうてき解放かいほうされる。ガベージコレクタは、メモリの解放かいほうわすれによってこるメモリリークを解消かいしょうする。C#は、データベース接続せつぞくのようなアンマネージドなリソースにたいしても明示めいじてき制御せいぎょする方法ほうほう提供ていきょうしている。これはIDisposableインタフェースusingステートメントまたはusing宣言せんげんによってなされる。

名前なまえ空間くうかんとオブジェクト指向しこうかたシステム

[編集へんしゅう]
たとえばC/C++のprintf()関数かんすうのように名前なまえ空間くうかんレベルに存在そんざいするフリー関数かんすう定義ていぎすることはできない。ほとんどの場合ばあいクラスおよび構造こうぞうたい名前なまえ衝突しょうとつけるために名前なまえ空間くうかん所属しょぞくする。
  • 名前なまえ空間くうかん階層かいそう構造こうぞうをもつ。つまり、名前なまえ空間くうかん名前なまえ空間くうかんなか宣言せんげんすることができる。
  • みのがたふくめたすべてのかたは、objectクラス (System.Object) の派生はせいがたである。つまりobjectクラスのもつすべてのプロパティやメソッドを継承けいしょうする。たとえば、すべてのかたToString()メソッドをもつ。
  • クラス (class) は参照さんしょうがたであり、構造こうぞうたい (struct) および列挙れっきょがた (enum) はがたである。構造こうぞうたいはクラスよりも軽量けいりょうで、C/C++との相互そうご運用うんようせいすぐれるが、派生はせいがた定義ていぎすることができない。
  • クラスおよび構造こうぞうたい複数ふくすうインタフェース実装じっそうすることができるが、多重たじゅう継承けいしょうはサポートされない。
  • C#はC++にくらべてかた安全あんぜんである。既定きてい暗黙あんもく変換へんかんは、整数せいすう範囲はんいひろげる変換へんかんや、派生はせいクラスから基底きていクラスへの変換へんかんといった、安全あんぜん変換へんかんのみに限定げんていされる。これは、コンパイルJITコンパイルとき、そして一部いちぶ動的どうてきなケースでは実行じっこう強制きょうせいされる。ブールがた整数せいすうがた列挙れっきょがた整数せいすうがた、のあいだ暗黙あんもく変換へんかんはできない。暗黙あんもく変換へんかんをユーザー定義ていぎするさいは、明示めいじてきにそのように指定していしなければならない。これはC++のコンストラクタとはちがった仕様しようである。
  • C#は「Null安全あんぜん」である。Null許容きょようがた、Null許容きょよう参照さんしょうがたち、Null合体がったい演算えんざんなどの構文こうぶん演算えんざんつ。
  • 列挙れっきょがたのメンバーは、列挙れっきょがたのスコープのなかかれる。また、列挙れっきょがた定数ていすうめい取得しゅとくすることができる。さらに、列挙れっきょがた定数ていすうめいから動的どうてき定数ていすうることができる。
  • アクセサ定義ていぎ利用りよう簡略かんりゃくするためにプロパティ構文こうぶん利用りようできる。C++およびJavaにおけるカプセルでは、通例つうれいgetter/setterアクセサとなるメンバー関数かんすうあるいはメソッドを定義ていぎして利用りようするが、C#ではプロパティ機能きのうにより、カプセル維持いじしつつ、あたかもフィールド直接ちょくせつきするような直感ちょっかんてき構文こうぶんでオブジェクトの状態じょうたいにアクセスすることができる。プロパティによってメンバーのアクセス制御せいぎょやデータの正当せいとうせいチェックを実行じっこうすることができる。なお、イベントハンドラー利用りようするデリゲートのカプセルにはイベント構文こうぶん (event) が用意よういされている。
  • ジェネリクス総称そうしょうがた)の採用さいようC# 2.0以降いこう)。C++のテンプレート、Javaのジェネリックスとことなりコンパイルかた情報じょうほう保持ほじされる。また、Javaのジェネリクスとことなりプリミティブがたかた変数へんすうとして使つかうことができる。

C# 2.0からの仕様しよう

[編集へんしゅう]

部分ぶぶんがた

[編集へんしゅう]

部分ぶぶんがた (Partial Type) が導入どうにゅうされた[a 1]以下いかのようにクラスや構造こうぞうたい宣言せんげんpartial修飾しゅうしょくをつけることで、その宣言せんげん分割ぶんかつすることができる。

partial class MyClass { int a; }
partial class MyClass { int b; }

これは以下いか同義どうぎである:

class MyClass { int a; int b; }

これによって、巨大きょだいなクラスを分割ぶんかつしたり、自動じどう生成せいせいされたコードを分離ぶんりしたりすることができる。partial 修飾しゅうしょくはすべての宣言せんげんにつける必要ひつようがある。

[19]

ジェネリクス

[編集へんしゅう]

ジェネリクス導入どうにゅうされた[a 1]。これは.NET Framework 2.0の機能きのうである。クラス、構造こうぞうたいインタフェース、デリゲート、メソッドにたいして適用てきようすることができる。

.NETのGenericsはC++のテンプレート、あるいはJavaにおけるそれともことなるもので、コンパイルによってではなく実行じっこうにランタイムによって特殊とくしゅされる。これによってことなる言語げんごあいだ運用うんよう可能かのうにし、リフレクションによってかたパラメーターにかんする情報じょうほう取得しゅとくすることができる。また、whereふしによってかたパラメーターに制約せいやくあたえることができる。一方いっぽう、C++のようにかたパラメーターとしてしき指定していすることはできない。なお、ジェネリックメソッドの引数ひきすうによってかたパラメーターが推論すいろんできる場合ばあいかたパラメーターの指定してい省略しょうりゃくできる。 [20]

静的せいてきクラス

[編集へんしゅう]

静的せいてきクラスが導入どうにゅうされた[a 1]static属性ぞくせいをクラスの宣言せんげんにつけることで、クラスはインスタンスできなくなり、静的せいてきなメンバーしかつことができなくなる。

[19]

イテレータ

[編集へんしゅう]

イテレータ#C# 2.0参照さんしょう

[21]

yieldキーワード
[編集へんしゅう]

yieldキーワードによるコルーチン使つかうことで、イテレータの生成せいせいらく実装じっそうできるようになった。

匿名とくめいデリゲート

[編集へんしゅう]

クロージャ機能きのう提供ていきょうする匿名とくめいデリゲート導入どうにゅうされた。

プロパティにたいする個別こべつのアクセス制御せいぎょ

[編集へんしゅう]

Property Accessors プロパティのget もしくは setアクセサのどちらかにアクセス修飾しゅうしょく指定していすることでアクセス制御せいぎょ別個べっこにできるようになった[a 1]つぎれいでは、getアクセサはpublicsetアクセサはprivateである。

public class MyClass
{
  private string status = string.Empty;
  public string Status
  {
    get { return status; }
    private set { status = value; }
  }
}

[22]

Null許容きょようがたとnull結合けつごう演算えんざん

[編集へんしゅう]

nullを保持ほじできるがたNullable導入どうにゅうされた[a 1]

int? i = 512;
i = null;

int? j = i + 500; //jはnullとなる。nullとの演算えんざん結果けっかはnullになる。

int?Nullable<int>糖衣とうい構文こうぶんである。また、nullを保持ほじしているNull許容きょようがたのインスタンスをボックスしようとすると、たんそら参照さんしょう (null) に変換へんかんされる[23]

int? x = null;
object o = x;
System.Console.WriteLine(o == null); //Trueが出力しゅつりょくされる

[24]

また、null結合けつごう演算えんざん (??)が導入どうにゅうされた。これは、nullでない最初さいしょかえす。

object obj1 = null;
object obj2 = new object();
object obj3 = new object();
return obj1 ?? obj2 ?? obj3; // obj2 をかえ

この演算えんざんおもNullableかたNullableかた代入だいにゅうするときに使つかわれる。

int? i = null;
int j = i ?? -1; // nullをintがた代入だいにゅうすることはできない

その

[編集へんしゅう]

C# 3.0からの仕様しよう

[編集へんしゅう]

varキーワード

[編集へんしゅう]

var キーワードが導入どうにゅうされ、かた推論すいろん利用りようしたローカル変数へんすう宣言せんげんができるようになった[a 1]

var s = "foo";
// うえぶん右辺うへんが string がたであるため、つぎのように解釈かいしゃくされる:
string s = "foo";
// 以下いかげるぶんあやまりである(コンパイルエラーとなる):
var v; // 初期しょきしきいている (かた推論すいろんする対象たいしょう存在そんざいしない)
var v = null; // かた推論すいろんできない (曖昧あいまいである)

拡張かくちょうメソッド

[編集へんしゅう]

拡張かくちょうメソッド (extension method) が導入どうにゅうされた[a 1]既存きそんのクラスを継承けいしょうしてあらたなクラスを定義ていぎすることなく、あらたなインスタンスメソッドを疑似ぎじてき追加ついか定義ていぎすることができる。具体ぐたいてきには、になっていない、ジェネリックの静的せいてきクラスないに、this 修飾しゅうしょくをつけた、拡張かくちょうメソッドを追加ついかする対象たいしょうかた引数ひきすう最初さいしょつメソッドをまず定義ていぎする。これによって、通常つうじょう静的せいてきメソッドとしてのしのほかに、指定していしたかたのインスタンスメソッドとしてのしをおこなうことができるメソッドをつくることができる。以下いかれいげる:

public static class StringUtil
{
  public static string Repeat(this string str, int count)
  {
    var array = new string[count];
    for (var i = 0; i < count; ++i) array[i] = str;
    return string.Concat(array);
  }
}

このれいは、文字もじれつstring かたのインスタンス)を指定していした回数かいすうかえ連結れんけつしたものをかえすメソッド Repeat を、既存きそんstring かた追加ついかしている。このメソッドは、以下いかのようにすことができる:

// 静的せいてきメソッドとしての
StringUtil.Repeat("foo", 4);
// 拡張かくちょうメソッドとしての
"foo".Repeat(4);
// (どちらのれいも "foofoofoofoo" をかえす)

また、列挙れっきょがたインタフェースなど本来ほんらいメソッドの実装じっそうないかたに、かけじょうインスタンスメソッドを追加ついかすることも可能かのうである。以下いかれいげる:

public enum Way
{
  None, Left, Right, Up, Down
}

public static class EnumUtil
{
  public static Way Reverse(this Way src)
  {
    switch (src)
    {
      case Way.Left:  return Way.Right;
      case Way.Right: return Way.Left;
      case Way.Up:    return Way.Down;
      case Way.Down:  return Way.Up;
      default: return Way.None;
    }
  }
}

このメソッドは以下いかのようにすことができる:

Way l = Way.Left;
Way r = l.Reverse(); // Way.Right

拡張かくちょうメソッドは糖衣とうい構文こうぶん一種いっしゅであり、カプセル原則げんそく違反いはんするものではないが、必要ひつよう場合ばあいかぎ注意ちゅういして実装じっそうすることがガイドラインとして推奨すいしょうされている[a 18]

部分ぶぶんメソッド

[編集へんしゅう]

部分ぶぶんメソッドが導入どうにゅうされた[a 1]部分ぶぶんがたpartial かたない定義ていぎされた private で、かつもどvoid のメソッドに partial 修飾しゅうしょくをつけることでメソッドの宣言せんげん定義ていぎ分離ぶんりさせることができる。定義ていぎされていない部分ぶぶんメソッドはなにおこなわず、なんらエラーを発生はっせいさせることもない。たとえば:

partial class Class
{
  partial void DebugOutput(string message);
  
  void Method()
  {
    DebugOutput("Some message");
    Console.WriteLine("Did something.");
  }
}

うえのコードにおいて Method()すと、Did something.表示ひょうじされるだけだが、ここで以下いかのコード:

partial class Class
{
  partial void DebugOutput(string message)
  {
    Console.Write("[DEBUG: {0}] ", message);
  }
}

追加ついかしたうえMethod()すと、[DEBUG: Some message] Did something.表示ひょうじされる。

ラムダしき

[編集へんしゅう]

ラムダしき導入どうにゅうされた[a 1]。この名前なまえラムダ計算けいさん由来ゆらいする。

以下いか匿名とくめいメソッド

// iを変数へんすうとしてi+1をかえすメソッド
delegate (int i) { return i + 1; }

は、ラムダしき使つかってつぎのように記述きじゅつできる:

(int i) => i + 1; /* しき形式けいしきのラムダ */
//あるいは:
(int i) => { return i + 1; }; /* ステートメント形式けいしきのラムダ */

ラムダしき匿名とくめいメソッドと同様どうようあつかえるが、しき形式けいしきのラムダがExpression<TDelegate>かたとしてあつかわれた場合ばあいのみ匿名とくめいメソッドとしてあつかわれず、コンパイラによってしき構築こうちくするコードに変換へんかんされる。匿名とくめいデリゲートが実行じっこうまえにコンパイルされたCIL保持ほじするのにたいし、しきCIL実行じっこうコンパイル可能かのうであるDOMのようなしき構造こうぞうそのものを保持ほじする。これはLINQクエリをSQLクエリなどに変換へんかんするさい役立やくだつ。

以下いかは、3つの任意にんい名前なまえ変数へんすう整数せいすう括弧かっこおよ四則しそく演算えんざんのみで構成こうせいされたしきぎゃくポーランド記法きほう変換へんかんする汎用はんようてきなコードである:

public static string ToRPN(Expression<Func<int, int, int, int>> expression)
{
  return Parse((BinaryExpression) expression.Body).TrimEnd(' ');
}

private static string Parse(BinaryExpression expr)
{
  string str = "";
  
  if (expr.Left is BinaryExpression)
  {
    str += Parse((BinaryExpression) expr.Left);
  }
  else if (expr.Left is ParameterExpression)
  {
    str += ((ParameterExpression) expr.Left).Name + " ";
  }
  else if (expr.Left is ConstantExpression)
  {
    str += ((ConstantExpression) expr.Left).Value + " ";
  }

  if (expr.Right is BinaryExpression)
  {
    str += Parse((BinaryExpression) expr.Right);
  }
  else if (expr.Right is ParameterExpression)
  {
    str += ((ParameterExpression) expr.Right).Name + " ";
  }
  else if (expr.Right is ConstantExpression)
  {
    str += ((ConstantExpression) expr.Right).Value + " ";
  }
  
  return str + expr.NodeType.ToString()
    .Replace("Add", "+")
    .Replace("Subtract", "-")
    .Replace("Multiply", "*")
    .Replace("Divide", "/")
    + " ";
}

// れい:
ToRPN((x, y, z) => (x + 1) * ((y - 2) / z)); // "x 1 + y 2 - z / *" をかえ

オブジェクト初期しょき簡略かんりゃく

[編集へんしゅう]

オブジェクトの初期しょきしきとして簡潔かんけつ記述きじゅつできるようになった。

var p = new Point { X = 640, Y = 480 };
// うえぶんつぎのように解釈かいしゃくされる:
Point __p = new Point();
__p.X = 640;
__p.Y = 480;
Point p = __p;

また、コレクションの初期しょき同様どうよう簡潔かんけつ記述きじゅつできるようになった。

var l = new List<int> {1, 2, 3};
var d = new Dictionary<string, int> {{"a", 1}, {"b", 2}, {"c", 3}};
// うえぶんつぎのように解釈かいしゃくされる:
List<int> __l = new List<int>();
__l.Add(1);
__l.Add(2);
__l.Add(3);
List<int> l = __l;
Dictionary<string, int> __d = new Dictionary<string, int>();
__d.Add("a", 1);
__d.Add("b", 2);
__d.Add("c", 3);
Dictionary<string, int> d = __d;

ただし、うえのコードでは匿名とくめい変数へんすう便宜べんぎてきに __p、__l、__d と命名めいめいしている。実際じっさいはプログラマはこの変数へんすうにアクセスすることはできない。

自動じどう実装じっそうプロパティ

[編集へんしゅう]

プロパティをより簡潔かんけつ記述きじゅつするための自動じどう実装じっそうプロパティが導入どうにゅうされた[a 1]。プロパティの定義ていぎget; set;記述きじゅつすることで、プロパティの保持ほじするための匿名とくめいのフィールド(プログラマは直接ちょくせつ参照さんしょうすることはできない)と、そのフィールドにアクセスするためのアクセサが暗黙あんもく定義ていぎされる。また、C# 5.0 までは get;set;のどちらか片方かたがただけを記述きじゅつすることは出来できなかったが、C# 6.0 からは get; のみが可能かのう以下いかのコード:

public int Value { get; set; }

は、以下いかのようなコードに相当そうとうする動作どうさをする:

private int __value;
public int Value
{
  get { return __value; }
  set { __value = value; }
}

ただし、うえのコードでは匿名とくめいのフィールドに便宜べんぎてき__value命名めいめいしている。実際じっさいはプログラマはこのフィールドにアクセスすることはできない。

匿名とくめいがた

[編集へんしゅう]

一時いちじてき使用しようされるかた簡単かんたん定義ていぎするための匿名とくめいがた導入どうにゅうされた[a 1]以下いかれいげる:

new { Name = "John Doe", Age = 20 }

うえしきは、以下いか内容ないようのクラスを暗黙あんもく定義ていぎする。定義ていぎされたクラスは匿名とくめいであるがゆえにプログラマは参照さんしょうできない。

public string Name { get; }
public int Age { get; }

おながたおな名前なまえのプロパティをおな順序じゅんじょならべた匿名とくめいがたおなじであることが保証ほしょうされている。すなわち、以下いかのコード:

var her = new { Name = "Jane Doe", Age = 20 }
var him = new { Name = "John Doe", Age = 20 }

において、her.GetType() == him.GetType()true である。

配列はいれつ宣言せんげんかた省略しょうりゃく

[編集へんしゅう]

new キーワードをもちいた配列はいれつ宣言せんげんさいかた省略しょうりゃくできるようになった。匿名とくめいがた配列はいれつ宣言せんげんするさい威力いりょく発揮はっきする。

var a = new[] {"foo", "bar", null};
// うえぶんつぎのように解釈かいしゃくされる:
string[] a = new string[] {"foo", "bar", null};
// 以下いかぶん:
var a = new[] {"foo", "bar", 123};
// はつぎのように解釈かいしゃくされることなく、あやまりとなる:
object[] a = new object[] {"foo", "bar", 123};

クエリしき

[編集へんしゅう]

LINQ をサポートするために、クエリしき導入どうにゅうされた[a 1]。これは SQL構文こうぶん類似るいじしており、最終さいしゅうてき通常つうじょうのメソッドしに変換へんかんされるものである。以下いかれいしめす:

var passedStudents =
  from s in students
  where s.MathScore + s.MusicScore + s.EnglishScore > 200
  select s.Name;

うえのコードは以下いかのように変換へんかんされる:

var passedStudents = students
  .Where(s => s.MathScore + s.MusicScore + s.EnglishScore > 200)
  .Select(s => s.Name);

C# 3.0で追加ついかされた構文こうぶんおおくはしきであるため、より巨大きょだいしき当然とうぜんクエリしきふくまれる)の一部いちぶとしてむことができる。旧来きゅうらい複数ふくすうぶんけたり、作業さぎょうよう変数へんすう用意よういして記述きじゅつしていたコードを単独たんどくしきとしてより簡潔かんけつ記述きじゅつできる可能かのうせいがある。

出井でい秀行ひでゆきちょの『実戦じっせん役立やくだつ C#プログラミングのイディオム/定石じょうせき&パターン』(技術評論社ぎじゅつひょうろんしゃ、2017ねん)という書籍しょせきではクエリ構文こうぶんよりメソッド構文こうぶん推奨すいしょうしており、クエリ構文こうぶんではLINQのすべての機能きのう使用しようできるわけではないこと、メソッドしは処理しょり連続れんぞくしてめる可読かどくせいがあること、メソッドしであればMicrosoft Visual Studio強力きょうりょくインテリセンス利用りようできることを理由りゆうに、著者ちょしゃはクエリ構文こうぶんをほとんど使用しようしていないとしるしている。

C# 4.0からの仕様しよう

[編集へんしゅう]

dynamicキーワード

[編集へんしゅう]

dynamicキーワードが導入どうにゅうされ、動的どうてき型付かたつ変数へんすう定義ていぎできるようになった[a 1]。dynamicがたとして宣言せんげんされたオブジェクトにたいする操作そうさのバインドは実行じっこうまで遅延ちえんされる。

// xはintがた推論すいろんされる:
var x = 1; 
// yはdynamicがたとしてあつかわれる:
dynamic y = 2; 

public dynamic GetValue(dynamic obj)
{
  // objにValueが定義ていぎされていなくとも、コンパイルエラーとはならない:
  return obj.Value;
}

オプション引数ひきすう名前なまえ引数ひきすう

[編集へんしゅう]

VBC++実装じっそうされているオプション引数ひきすう名前なまえ引数ひきすうが、C#でも利用りようできるようになった[a 1]

public void MethodA()
{
  // だい1引数ひきすうだい2引数ひきすう指定していだい3引数ひきすう指定してい:
  Console.WriteLine("Ans: " + MethodB(1, 2));  // Ans: 3 … 1 + 2 + 0となっている

  // だい1引数ひきすうだい3引数ひきすう指定していだい2引数ひきすう指定してい:
  Console.WriteLine("Ans: " + MethodB(A: 1, C: 3));  // Ans: 4 … 1 + 0 + 3となっている
}

// 引数ひきすう指定していされなかった場合ばあいのデフォルト等号とうごうむすぶ:
public int MethodB(int A = 0, int B = 0, int C = 0)
{
  return A + B + C;
}

ジェネリクスのきょう変性へんせいはん変性へんせい

[編集へんしゅう]

ジェネリクスのかた引数ひきすうたいしてin、out修飾しゅうしょく指定していすることにより、ジェネリクスのきょう変性へんせいはん変性へんせい指定していできるようになった[a 1]

IEnumerable<string> x = new List<string> { "a", "b", "c" };
// IEnumerable<T>インターフェイスはかた引数ひきすうにout修飾しゅうしょく指定していされているため、きょうへんである。
// したがって、C# 4.0ではつぎくだりはコンパイルエラーにならない
IEnumerable<object> y = x;

C# 5.0からの仕様しよう

[編集へんしゅう]
  • 非同期ひどうき処理しょり (async/await)[a 1]
  • もと情報じょうほう属性ぞくせい[a 1]
  • foreach の仕様しよう変更へんこう

非同期ひどうき処理しょり (async/await)

[編集へんしゅう]

C# 6.0からの仕様しよう

[編集へんしゅう]
  • 自動じどう実装じっそうプロパティの初期しょき[a 19]
  • get のみの自動じどう実装じっそうプロパティおよびコンストラクタ代入だいにゅう[a 19]
  • 静的せいてき using ディレクティブ[a 19]
  • インデックス初期しょき[a 19]
  • catch/finally での await[a 19]
  • 例外れいがいフィルタ[a 19]
  • しき形式けいしきのメンバー (expression-bodied members)[a 19]
  • null条件じょうけん演算えんざん[a 19]
  • 文字もじれつ補間ほかん(テンプレート文字もじれつ[a 19]
  • nameof 演算えんざん[a 19]
  • #pragma
  • コレクションの初期しょきでの拡張かくちょうメソッド[a 19]
  • オーバーロード解決かいけつ改善かいぜん[a 19]

静的せいてき using ディレクティブ

[編集へんしゅう]

静的せいてき using ディレクティブを利用りようすることで、型名かためい指定していしにクラスの静的せいてきメンバーのしをおこなえるようになった。利用りようするにはusing staticのち完全かんぜん修飾しゅうしょくなクラスめい指定していする。

using static System.Math;
// ↑ソースコードの上部じょうぶ宣言せんげん
class Hogehoge {
    // System.Math.Pow() , System.Math.PI を修飾しゅうしょくしで
    double area = Pow(radius, 2) * PI;
}

例外れいがいフィルタ

[編集へんしゅう]

catchのちwhenキーワードを使用しようすることで、処理しょりする例外れいがい限定げんていすることができるようになった。

try {
    // ...
}
catch (AggregateException ex) when (ex.InnerException is ArgumentException) {
    // ...
}

C# 7.0からの仕様しよう

[編集へんしゅう]
  • 出力しゅつりょく変数へんすう宣言せんげん
  • パターンマッチング (is しき/switch ぶん)
  • タプル (タプル記法きほう/分解ぶんかい/破棄はき)
  • ローカル関数かんすう
  • 数値すうちリテラルの改善かいぜん(けたセパレータ/バイナリリテラル)
  • refもど、ref変数へんすう
  • 非同期ひどうきもどがた汎用はんよう
  • Expression-bodied 機能きのう拡充かくじゅう(コンストラクタ/デストラクタ/get/set/add/remove)
  • Throw しき

出力しゅつりょく変数へんすう宣言せんげん

[編集へんしゅう]

out引数ひきすう場合ばあい、その場所ばしょ変数へんすう宣言せんげん可能かのうとなった[a 20]

total += int.TryParse("123", out var num) ? num : 0;

パターンマッチング

[編集へんしゅう]
is しき拡張かくちょう
[編集へんしゅう]

isしき構文こうぶん拡張かくちょうされ、かたうしろに変数へんすうめい宣言せんげんできるようになった[a 20]拡張かくちょうされたisしきはマッチした場合ばあい宣言せんげんした変数へんすうにキャストした代入だいにゅうし、さらにtrue評価ひょうかされる。 マッチしなかった場合ばあいfalse評価ひょうかされ、宣言せんげんした変数へんすう初期しょき状態じょうたいとなる。

void CheckAndSquare(object obj) {
    // objのかたチェックと同時どうじにnumに代入だいにゅうする。
    if (obj is int num && num >= 0) {
        num = num * num;
    }
    else {
        num = 0;
    }
    // ifぶん条件じょうけんセクションは、ifの外側そとがわおなじスコープ
    Console.WriteLine(num);
}
switch ぶん拡張かくちょう
[編集へんしゅう]

switchぶんのマッチ方法ほうほう拡張かくちょうされ、caseラベルに従来じゅうらいの「定数ていすうパターン」にくわえ、あらたに「かたパターン」を指定していできるようになった。 また、「かたパターン」のcaseラベルでは、when条件じょうけん指定していすることができる。 「かたパターン」をふくswitchぶんでは、かならずしも条件じょうけん排他はいたてきでなくなったため、最初さいしょにマッチしたcaseラベルの処理しょり実行じっこうされる。[a 21]

void Decide(object obj) {
    switch (obj) {
        case int num when num < 0:
            Console.WriteLine($"{num}はまけかずです。");
            break;
        case int num:
            Console.WriteLine($"{num}を二乗にじょうすると{num * num}です。");
            break;
        case "B":
            Console.WriteLine($"これはBです。");
            break;
        case string str when str.StartsWith("H"):
            Console.WriteLine($"{str}はHからはじまる文字もじれつです。");
            break;
        case string str:
            Console.WriteLine($"{str}は文字もじれつです。");
            break;
        case null:
            Console.WriteLine($"nullです");
            break;
        default:
            Console.WriteLine("判別はんべつできませんでした");
            break;
    }
}

タプルのための軽量けいりょう構文こうぶん導入どうにゅうされた[a 20]従来じゅうらいSystem.Tupleクラスとはべつに、System.ValueTuple構造こうぞうたいあたらしく追加ついかされた。

タプル記法きほう
[編集へんしゅう]

2以上いじょう要素ようそつタプルのための記法きほう導入どうにゅうされた。 引数ひきすうリストと同様どうよう形式けいしきで、タプルを記述きじゅつできる。

// タプル記法きほう
(int, string) tuple = (123, "Apple");
Console.WriteLine($"{tuple.Item1}の{tuple.Item2}");
分解ぶんかい
[編集へんしゅう]

多値たちもど簡単かんたんあつかえるように、分解ぶんかいがサポートされた[a 20]

var tuple = (123, "Apple");
// 分解ぶんかい
(int quantity, string name) = tuple;
Console.WriteLine($"{quantity}の{name}");

分解ぶんかいはタプルにかぎらない。Deconstruct()メソッドが定義ていぎされたクラスでも、分解ぶんかい利用りようできる[a 20]

以下いかに、DateTimeかた分解ぶんかい導入どうにゅうするれいしめす。

static class DateExt {
    public static void Deconstruct(this DateTime dateTime, out int year, out int month, out int day) {
        year = dateTime.Year;
        month = dateTime.Month;
        day = dateTime.Day;
    }
}

上記じょうきのコードでDateTimeかたDeconstruct()拡張かくちょうメソッドを定義ていぎし、

// 分解ぶんかい
(int year, int month, int day) = DateTime.Now;

のように左辺さへんで3つの変数へんすうることができる。

破棄はき

[編集へんしゅう]

分解ぶんかい、out引数ひきすう、パターンマッチングで、破棄はき明示めいじするために_利用りようできるようになった。 破棄はきされたは、あと参照さんしょうすることはできない。

// とし使つかわない
(_, int month, _) = DateTime.Now;

// 解析かいせき結果けっかだけ取得しゅとくし、変換へんかんされた使つかわない
bool isNumeric = int.TryParse(str, out _);

switch (obj) {
    // stringがた分岐ぶんきするが、使つかわない
    case string _:
        // Do something.
        break;
}

refもど、ref変数へんすう

[編集へんしゅう]

refキーワードの使用しよう方法ほうほう拡張かくちょうされた。これによって、安全あんぜん参照さんしょう使つかみちひろがった。

refもど
[編集へんしゅう]

もどかたref修飾しゅうしょくすることで、オブジェクトの参照さんしょうもどとすることができる。

// ふたつの参照さんしょう引数ひきすううちおおきいものの参照さんしょうもどかえ
static ref int Max(ref int left, ref int right) {
    if (left >= right) {
        return ref left;
    }
    else {
        return ref right;
    }
}

変数へんすう寿命じゅみょうわらないため、メソッド終了しゅうりょう破棄はきされるローカル変数へんすうをrefもどとすることはできない。

static int s_count = 1;

// メンバーの参照さんしょうはrefもどになる。
static ref int ReturnMember() {
    return ref s_count;
}
// ref引数ひきすうはもちろんrefもどになる。
static ref int ReturnRefParam(ref int something) {
    return ref something;
}
// ローカル変数へんすうをrefもどとすることはできない。
// static ref int ReturnLocal() {
//     int x = 1;
//     return ref x;
// }
ref変数へんすう
[編集へんしゅう]

ローカル変数へんすうかたref修飾しゅうしょくすることで、参照さんしょう代入だいにゅうすることができる。

// 参照さんしょうもど参照さんしょう変数へんすう
ref int max = ref Max(ref x, ref y);
// limitとmaxはおな参照さんしょうする
ref int limit = ref max;

C# 7.1からの仕様しよう

[編集へんしゅう]

非同期ひどうきなMainメソッド

[編集へんしゅう]

Mainメソッドのもどとして、TaskかたTask(int)かたみとめられた[a 22]

static Task Main()
static Task<int> Main()

defaultしき

[編集へんしゅう]

かた推論すいろん可能かのう場面ばめんでは、defaultかた指定してい省略しょうりゃく可能かのうとなった[a 22]

int number = default;
string name = default;

C# 7.2からの仕様しよう

[編集へんしゅう]

C#7.2で追加ついかされた仕様しよう以下いかとお[a 23][28]

がた参照さんしょうセマンティクス

[編集へんしゅう]

がたにおけるパフォーマンス向上こうじょう意図いとした複数ふくすう機能きのう追加ついかされた。

in参照さんしょうわたし、ref readonly参照さんしょうもど
[編集へんしゅう]

引数ひきすうin指定していすることで、専用せんよう参照さんしょうわたしを指定していできる。 また、もどref readonly指定していすることで、専用せんよう参照さんしょうもど指定していできる。

これにより、構造こうぞうたいのコピーをけるとともに、意図いとしない変更へんこう抑止よくしできる。

readonly構造こうぞうたい
[編集へんしゅう]

構造こうぞうたい宣言せんげんreadonly指定していすることで、しん専用せんよう構造こうぞうたい定義ていぎできる。 readonly構造こうぞうたいすべてのフィールドはreadonlyでなければならず、thisポインタも専用せんようとなる。

これにより、メンバーアクセス意図いとしない防御ぼうぎょてきコピーを抑止よくしできる。

ref構造こうぞうたい
[編集へんしゅう]

構造こうぞうたい宣言せんげんref指定していすることで、ヒープ領域りょういきへのコピーをふせ構造こうぞうたいがサポートされる。 ref構造こうぞうたいでは、boxできない、配列はいれつ作成さくせいできない、かた引数ひきすうになることができない、など、ヒープ領域りょういきへのコピーをふせぐためのきびしい制限せいげんがかかる。

この機能きのうは、Span<T>のような構造こうぞうたいをサポートするために利用りようされ、unsafe文脈ぶんみゃく以外いがいでのstackalloc利用りようをも可能かのうとする。

末尾まつび以外いがい場所ばしょでの名前なまえ引数ひきすう

[編集へんしゅう]

C#4.0で追加ついかされた名前なまえ引数ひきすう末尾まつび以外いがいでも利用りようできるようになった。

Hogehoge(name: "John", 17);

private protected アクセス修飾しゅうしょく

[編集へんしゅう]

どういちアセンブリない、かつ、継承けいしょうさきからのアクセス許可きょかあらわprivate protectedアクセス修飾しゅうしょく追加ついかされた。

数値すうちリテラルの改善かいぜん

[編集へんしゅう]

じゅうろくしんリテラルの0xしんリテラルの0b直後ちょくごのアンダースコアがみとめられた。

int bin = 0b_01_01;
int hex = 0x_AB_CD;

C# 7.3からの仕様しよう

[編集へんしゅう]

C#7.3では以下いか仕様しよう追加ついかされた[a 24]

  • ジェネリックがた制約せいやく種類しゅるい追加ついか
    • System.Enum, System.Delegate
    • unmanaged (文脈ぶんみゃくキーワード)
unsafe class MyGenericsClass<T1,T2,T3> 
    where T1 : System.Enum
    where T2 : System.Delegate
    where T3 : unmanaged {

    public MyGenericsClass(T1 enum1, T1 enum2, T2 func, T3 unmanagedValue) {
        if (enum1.HasFlag(enum2)) {
            func.DynamicInvoke();
        }
        else {
            T3* ptr = &unmanagedValue;
        }
    }
}
  • refローカル変数へんすう再割さいわ
  • stackalloc初期しょき
  • Indexing movable fixed buffers
  • カスタムfixedステートメント
  • オーバーロード解決かいけつルールの改善かいぜん
  • 出力しゅつりょく変数へんすう宣言せんげん利用りよう箇所かしょ追加ついか
class MyOutVar {
    // メンバー変数へんすう初期しょきやコンストラクタ初期しょき出力しゅつりょく変数へんすう宣言せんげん可能かのう
    readonly int x = int.TryParse("123", out var number) ? number : -1;
}
  • タプル同士どうし比較ひかく
(long, long) tuple = (1L, 2L);
// タプルのすべての要素ようそあいだで == が比較ひかく可能かのう
if (tuple == (1, 2)) { }
// 要素ようそすうことなるタプル同士どうし比較ひかくできない。
//if (tuple == (1, 2, 3)) { }
  • バッキングフィールドにたいするAttribute指定してい
// C#7.2までは無効むこう指定してい(コンパイル自体じたい可能かのう無視むしされる)
// C#7.3からはバッキングフィールドにたいするAttribute指定していなされる
[field: NonSerialized]
public int MyProperty { get; set; }

C# 8.0からの仕様しよう

[編集へんしゅう]

C# 8.0で追加ついかされた仕様しよう以下いかとおり。[a 25][29]

null許容きょよう参照さんしょうがた

[編集へんしゅう]

参照さんしょうがたにnull許容きょようせい指定していできるようになった。参照さんしょうがた型名かためい?付加ふかした場合ばあいにnull許容きょよう参照さんしょうがたとなる。

参照さんしょうがた型名かためい?付加ふかしない場合ばあい、null許容きょよう参照さんしょうがたとなる。

フロー解析かいせきレベルでのnull許容きょようせいチェックがおこなわれる。null許容きょようがたNullable<T>のようなあたらしいかた導入どうにゅうされない。

null許容きょようコンテキスト
[編集へんしゅう]

参照さんしょうがたのnull許容きょようせいは、null許容きょようコンテキストによって有効ゆうこう無効むこうえが可能かのうである。 C#7.3以前いぜん互換ごかんせいのために、既定きていでは無効むこうとなっている。

  • Nullable コンパイルオプション: プロジェクト全体ぜんたいでのnull許容きょようコンテキストを指定していする
  • #nullable ディレクティブ: ソースコードの部分ぶぶんごとにnull許容きょようコンテキストを指定していする
    • annotations オプション、warningsオプションにより、適用てきよう範囲はんい限定げんていできる
null免除めんじょ演算えんざん
[編集へんしゅう]

null許容きょよう参照さんしょうがた変数へんすうめいのち!使用しようすることで、フロー解析かいせき警告けいこく免除めんじょされる。

インタフェースの既定きていメンバー

[編集へんしゅう]

インタフェースのメンバーに既定きてい実装じっそう指定していできるようになった。また、インタフェース静的せいてきメンバーをつことができるようになった。

さらに、インタフェースのメンバーにアクセシビリティを指定していできるようになった。

  • 既定きていのアクセシビリティは、従来じゅうらいどおpublic となる。
  • 実装じっそうがあるインスタンスメンバーは、既定きていvirtual となり override可能かのうである。
  • 実装じっそうoverrideさせないためにsealed指定していすることができる。

パターンマッチングの拡張かくちょう

[編集へんしゅう]

switchしき追加ついかされた。 プロパティパターン、タプルパターン、位置いち指定していパターンの追加ついかにより、再帰さいきてきなパターンマッチングが可能かのうになった。

  • switchしき
  • 再帰さいきパターン
    • プロパティパターン
    • タプルパターン
    • 位置いち指定していパターン

非同期ひどうきストリーム

[編集へんしゅう]

IAsyncEnumerable<T> インタフェースかえすことで、イテレータ構文こうぶん非同期ひどうき構文こうぶん共存きょうぞん可能かのうになった。

async IAsyncEnumerable<int> EnumerateAsync() {
    await Task.Delay(100);
    yield return 1;
    await Task.Delay(100);
    yield return 2;
}

await foreachによって非同期ひどうきストリームを列挙れっきょする。

async void SpendAsync() {
    await foreach (var item in EnumerateAsync()) {
        Console.WriteLine(item);
    }
}

範囲はんい指定してい

[編集へんしゅう]

IndexRange指定していできる専用せんよう構文こうぶん追加ついかされた。

  Index a = 1; // new Index(1, fromEnd: false)
  Index b = ^1; // new Index(1, fromEnd: true)
  Range range = a..b; // new Range(start: a, end: b)

その仕様しよう

[編集へんしゅう]
  • 静的せいてきローカル関数かんすう
  • null結合けつごう代入だいにゅう演算えんざん
  • 構造こうぞうたい専用せんようメンバー
  • using 宣言せんげん
  • ref構造こうぞうたいのDispose
  • ジェネリクスをふくむアンマネージがた
  • しきちゅうstackalloc
  • 文字もじれつ補間ほかんのトークン順序じゅんじょ緩和かんわ

C# 9.0からの仕様しよう

[編集へんしゅう]

C# 9.0で追加ついかされた仕様しよう以下いかとおり。

[a 26]

  • レコード
  • プロパティのinitアクセサ
  • さい上位じょういレベルステートメント
  • パターンマッチングの拡張かくちょう
  • newしきかた推論すいろん
  • 条件じょうけん演算えんざんかた推論すいろん
  • きょうへんもど
  • GetEnumeratorの拡張かくちょうメソッド対応たいおう
  • 静的せいてき匿名とくめい関数かんすう
  • ラムダしき引数ひきすう破棄はき
  • ローカル関数かんすうへの属性ぞくせい適用てきよう
  • パフォーマンスと相互そうご運用うんよう
    • ネイティブサイズの整数せいすうがた(nint nuintかた)
    • 関数かんすうポインタ(delegate*かた)
    • 変数へんすう初期しょきフラグの抑制よくせい
  • コードジェネレータのサポート
    • モジュール初期しょき
    • 部分ぶぶんメソッドの拡張かくちょう

C# 10.0からの仕様しよう

[編集へんしゅう]

C# 10.0で追加ついかされた仕様しよう以下いかとおり。

[a 27]

  • レコード構造こうぞうたい
  • 構造こうぞう体型たいけい機能きのう強化きょうか
  • 補間ほかんされた文字もじれつハンドラー
  • global using ディレクティブ
  • ファイル スコープの名前なまえ空間くうかん宣言せんげん
  • 拡張かくちょうプロパティのパターン
  • ラムダしき機能きのう強化きょうか
  • const 補間ほかん文字もじれつ許可きょかする
  • レコードのかたで ToString() を封印ふういんできる
  • 限定げんてい代入だいにゅう機能きのう強化きょうか
  • おな分解ぶんかい代入だいにゅう宣言せんげん両方りょうほう許可きょかする
  • メソッドで AsyncMethodBuilder 属性ぞくせい許可きょかする
  • CallerArgumentExpression 属性ぞくせい
  • 拡張かくちょう #line pragma
  • 警告けいこくウェーブ 6

C# 11.0からの仕様しよう

[編集へんしゅう]

C# 11.0で追加ついかされた仕様しよう以下いかとおり。[a 10][b 6]

なま文字もじれつリテラル

[編集へんしゅう]

エスケープなどの加工かこうほどこさない文字もじれつを3じゅう引用いんようくくって表現ひょうげんできるようになった。加工かこう文字もじリテラルともばれる。

string logMsg = """
	原因げんいん不明ふめいのエラ発生はっせいしました。
	詳細しょうさいはログファイル "C:\Logs\exception.log" 確認かくにんしてください。
	""";

汎用はんよう属性ぞくせい

[編集へんしゅう]

属性ぞくせいかたかた引数ひきすうてるようになった。

// 属性ぞくせい
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ConverterContractAttribute<TFrom, TTo> : Attribute { }

// 使用しようれい
[ConverterContract<byte, string>()]
[ConverterContract<sbyte, string>()]
[ConverterContract<short, string>()]
[ConverterContract<ushort, string>()]
[ConverterContract<int, string>()]
[ConverterContract<uint, string>()]
[ConverterContract<long, string>()]
[ConverterContract<ulong, string>()]
public class IntToStringConverter
{
	// ...
}

パターンマッチングの拡張かくちょう

[編集へんしゅう]

リストや配列はいれつたいするパターンマッチが可能かのうになった[a 28][b 10]

int[] nums = new[] { 0, 1, 2, 3, 4, 5 };
if (nums is [ 0, 1, 2, .. ]) {
	Console.WriteLine("配列はいれつは 0, 1, 2 からはじまります。");
} else {
	Console.WriteLine("配列はいれつは 0, 1, 2 からはじまりません。");
}

また、Span<char>ReadOnlySpan<char>たいして文字もじれつもちいたパターンマッチが可能かのうになった。

bool CheckSignature(ReadOnlySpan<char> sig)
{
	return sig is "HOGE";
}

ジェネリックがた数値すうち演算えんざん

[編集へんしゅう]

かた引数ひきすうに「数値すうちがたまたは数値すうちがた類似るいじしているかた」であることしめ制約せいやくくわえる機能きのう導入どうにゅうされた[a 29][b 11]。また、それに呼応こおうして下記かき変更へんこうおこなわれた。

  • 明示めいじてき論理ろんりシフト演算えんざん>>>演算えんざん)が追加ついかされた。
  • シフト演算えんざん右側みぎがわ引数ひきすうかたたいする制限せいげん撤廃てっぱいされ、intかた以外いがいかた指定していできるようになった。
  • checked演算えんざんのオーバーロードができるようになった。
  • インターフェースのメソッドにたいしてstatic abstractキーワード(静的せいてき抽象ちゅうしょう)とstatic virtualキーワード(静的せいてき仮想かそう)を指定していできるようになった[a 30][a 31]

ジェネリックがた数値すうち演算えんざんもちいたいちれい下記かきしめ[a 32]

// 大抵たいてい演算えんざんインターフェイスは System.Numerics ない実装じっそうされている。
using System.Numerics;

// 任意にんいかたたいして加算かさんおこなことができる関数かんすう
static T MyAdd<T>(T value1, T value2)
	where T: IAdditionOperators<T, T, T> // 加算かさん可能かのうかたのみをける制約せいやく
	=> value1 + value2; // + 演算えんざん使つかことができる。

// 上記じょうき関数かんすう定義ていぎのみで、下記かきよう加算かさん演算えんざん定義ていぎされたかたであれば、任意にんいかたことができる。
int    a = MyAdd(  123,   456); // 結果けっか:579
ulong  b = MyAdd(111UL, 222UL); // 結果けっか:333
double c = MyAdd( 1.5D,  2.1D); // 結果けっか:3.6

その仕様しよう

[編集へんしゅう]
  • UTF-8 文字もじれつリテラル
  • 文字もじれつ補間ほかんしき改行かいぎょう
  • ファイルローカルがた
  • 必須ひっすメンバー
  • auto-default 構造こうぞうたい構造こうぞうたい初期しょきのフィールド変数へんすう自動的じどうてき既定きてい初期しょきされる)
  • nameof のスコープ拡張かくちょう
  • IntPtr別名べつめい nintUIntPtr別名べつめい nuintいた
  • ref フィールド
  • scoped ref 変数へんすう
  • メソッドグループからデリゲートへの変換へんかん改善かいぜん
  • 警告けいこくウェーブ 7

C# 12.0からの仕様しよう

[編集へんしゅう]

C# 12.0で追加ついかされた仕様しよう以下いかとおり。[a 13][b 7]

クラスと構造こうぞうたいのプライマリコンストラクター

[編集へんしゅう]

レコードがたrecord以外いがいのクラス(class)と構造こうぞうたいstruct)でプライマリコンストラクターが使つかえるようになった。

class Example(string message) 
{
    public string Message { get; } = message;
}

コレクションしき

[編集へんしゅう]

配列はいれつ、コレクション、Span<T>などの初期しょき記法きほう共通きょうつう記法きほう[])でけるようになった。

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];

// Create a list:
List<string> b = ["one", "two", "three"];

// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];

スプレッド演算えんざん

[編集へんしゅう]

コレクションしき複数ふくすうのコレクションをインライン展開てんかいできるあたらしい演算えんざん..)が追加ついかされた。

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
int[] single = [.. row0, .. row1, .. row2];

その仕様しよう

[編集へんしゅう]
  • インライン配列はいれつ
  • 既定きていのラムダ パラメーター
  • 任意にんいかた別名べつめい設定せってい
  • ref readonly パラメーター
  • 試験しけん段階だんかい属性ぞくせい
  • インターセプター

実装じっそう

[編集へんしゅう]

C#の言語げんご仕様しよう標準ひょうじゅん団体だんたいEcma Internationalつうじて公開こうかい標準ひょうじゅんされており、第三者だいさんしゃがマイクロソフトとは無関係むかんけいにコンパイラや実行じっこう環境かんきょう実装じっそうすることができる[2][30]

コンパイラの実装じっそう

[編集へんしゅう]

げん段階だんかいで、C#コンパイラの実装じっそうつぎの5つがられている。

  • マイクロソフトせい
    • Visual Studio 2015 以降いこう使用しようされている、.NETコンパイラプラットフォーム (コードネーム Roslyn)。ApacheライセンスオープンソースプロジェクトでGitHub公開こうかいされている[31]WindowsmacOSLinux動作どうさする。C#のコンパイラはC#、VB.NETのコンパイラはVB.NETで実装じっそうされている。以前いぜんのコンパイラとくらべて、リファクタリングやIDE、スクリプティングなどへの利用りよう可能かのうなAPIが公開こうかいされており、コンパイラ以外いがいへの様々さまざま応用おうよう可能かのう
    • Visual Studio 2013 まで使つかわれていた、マイクロソフトによるVisual C# コンパイラ。
    • 2006ねんのC# 2.0当時とうじの、マイクロソフトによるShared Source Common Language Infrastructure共通きょうつう言語げんご基盤きばん (CLI) とC#コンパイラがソースコードで公開こうかいされている。
  • Mono ProjectによるMonoうちの Mono Compiler Suite (mcs)。
  • 2012ねんまで開発かいはつされていた、DotGNU ProjectによるPortable.NETうちの the C-Sharp code compiler (cscc)。

実行じっこう環境かんきょう実装じっそう

[編集へんしゅう]

名称めいしょう

[編集へんしゅう]
  • ECMA-334 3rd/4th/5th edition によると、C# は「C Sharp」(シーシャープ)と発音はつおんし、LATIN CAPITAL LETTER C (U+0043)のちNUMBER SIGN # (U+0023)[33]音楽おんがくシャープ (♯, MUSIC SHARP SIGN (U+266F)) ではなくナンバーサイン (#) を採用さいようしたのは、フォントブラウザなどの技術ぎじゅつてき制約せいやくくわえ、ASCIIコードおよび標準ひょうじゅんてきキーボードには前者ぜんしゃ記号きごう存在そんざいしないためである。
  • "#"接尾せつびは、の.NET言語げんごにも使用しようされており、J#(Javaのマイクロソフトによる実装じっそう)、A#Adaから)、F#System Fなどから[34])がふくまれる。また"#"接尾せつびGtk#GTKなどのGNOMEライブラリの.NETラッパ)、Cocoa#Cocoa (API)のラッパ)などのライブラリにも使用しようされている。そのほか、SharpDevelopなどの"Sharp"をかんする関連かんれんソフトウェアも存在そんざいする。
  • C#という名称めいしょう解釈かいしゃくとして、「(A-Gであらわされた)直前ちょくぜんおと半音はんおんげる」という音楽おんがく記号きごう役割やくわり着目ちゃくもくし、「C言語げんご改良かいりょうしたもの」を意味いみしたのではないか、というものがある[よう出典しゅってん]。これは、C++名称めいしょうが「C言語げんごを1つすすめたもの」という意味いみでつけられたことにもている。
  • アンダース・ヘルスバーグは、「C#」が「C++++」(すなわち「C++をさらにすすめたもの」)にみえるのが由来ゆらいである、とかたっている[35][36]

注釈ちゅうしゃく

[編集へんしゅう]
  1. ^ すべてではなく一部いちぶにプロプライエタリなコンポーネントもある。そのため、それに依存いぞんするものなど、後述こうじゅつのMonoなどで制限せいげんがある場合ばあいがある[2]
  2. ^ a b (LINQをのぞく)[7]

出典しゅってん

[編集へんしゅう]
  1. ^ Announcing C# 12”. マイクロソフト (2023ねん11月14にち). 2023ねん12月19にち閲覧えつらん
  2. ^ a b Abel Avram (2009ねん7がつ29にち). “だれでもC#とCLIの正式せいしき実装じっそう可能かのう”. InfoQ. 2019ねん12月2にち閲覧えつらん
  3. ^ Visual Basic 言語げんご戦略せんりゃく - Visual Basic”. Microsoft (2023ねん5がつ10日とおか). 2023ねん12月23にち閲覧えつらん
  4. ^ Visual Studio Code ようの C# 開発かいはつキット - Visual Studio Subscription”. Microsoft (2023ねん10がつ13にち). 2023ねん12月23にち閲覧えつらん
  5. ^ Standard ECMA-334”. ECMA. 2023ねん12月23にち閲覧えつらん
  6. ^ Standard ECMA-334-archive”. 2018ねん11月13にち時点じてんオリジナルよりアーカイブ。2018ねん11月13にち閲覧えつらん
  7. ^ Using C# 3.0 from .NET 2.0”. Danielmoth.com (May 13, 2007). October 4, 2012閲覧えつらん
  8. ^ “Microsoft、「.NET Framework 4.6」を正式せいしき公開こうかい. まどもり. https://forest.watch.impress.co.jp/docs/news/712658.html 2021ねん1がつ23にち閲覧えつらん 
  9. ^ “.NET Framework 4.7が一般いっぱん公開こうかいされる”. InfoQ. https://www.infoq.com/jp/news/2017/05/net47-released/ 2021ねん1がつ23にち閲覧えつらん 
  10. ^ “Micorsoftが.NET Core 3.0をリリース”. InfoQ. https://www.infoq.com/jp/news/2019/12/microsoft-releases-dotnet-core-3/ 2021ねん1がつ23にち閲覧えつらん 
  11. ^ Richard Lander (2020ねん11月10にち). “Announcing .NET 5.0” (英語えいご). .NET Blog. Microsoft. 2020ねん11月11にち閲覧えつらん
  12. ^ Native AOT deployment overview - .NET”. Microsoft (2023ねん9がつ12にち). 2023ねん12月23にち閲覧えつらん
  13. ^ IL2CPP の概要がいよう - Unity マニュアル”. Unity. 2023ねん12月23にち閲覧えつらん
  14. ^ Burst の概要がいよう”. Unity. 2023ねん12月23にち閲覧えつらん
  15. ^ Hello World - C# の概要がいようかんする対話たいわがたチュートリアル”. Microsofit. 2023ねん12月23にち閲覧えつらん
  16. ^ 暗黙あんもくてきな using ディレクティブ .NET プロジェクト SDK の概要がいよう”. 2023ねん12月23にち閲覧えつらん
  17. ^ a b c さい上位じょういレベルのステートメント - C# チュートリアル - C#”. 2023ねん12月23にち閲覧えつらん
  18. ^ みの参照さんしょうがた - C# リファレンス - C#”. Microsoft (2023ねん5がつ10日とおか). 2023ねん12月23にち閲覧えつらん
  19. ^ a b 高橋たかはし 2005, p. 70.
  20. ^ 高橋たかはし 2005, pp. 63–64.
  21. ^ 高橋たかはし 2005, pp. 68–70.
  22. ^ 高橋たかはし 2005, pp. 70, 71.
  23. ^ null 許容きょようがたのボックス (C# プログラミング ガイド)” (pdf). Microsoft. 2008ねん6がつ2にち閲覧えつらん
  24. ^ 高橋たかはし 2005, p. 68.
  25. ^ 高橋たかはし 2005, pp. 66, 67.
  26. ^ 高橋たかはし 2005, p. 71.
  27. ^ 高橋たかはし 2005, p. 72.
  28. ^ Mads Torgersen (2017ねん11月15にち). “Welcome to C# 7.2 and Span” (英語えいご). .NET Blog. Microsoft. 2017ねん11月23にち閲覧えつらん
  29. ^ MicrosoftがC# 8.0をリリース”. InfoQ (2019ねん12月10にち). 2019ねん12月12にち閲覧えつらん
  30. ^ Tim Smith (2010ねん10がつ4にち). “Javaと.NETの特許とっきょ問題もんだいへのみじか紹介しょうかい”. InfoQ. 2019ねん12月2にち閲覧えつらん
  31. ^ dotnet/roslyn - GitHub
  32. ^ ゲームプログラムのC#8.0/.NET対応たいおうとその未来みらい”. CAPCOM. 2024ねん6がつ29にち閲覧えつらん
  33. ^ Standard ECMA-334 C# Language Specification
  34. ^ The A-Z of programming languages: F# | Network World
  35. ^ レポート:コミュニティスペシャルセッション with Anders Hejlsberg in Microsoft Developers Conference 2006
  36. ^ C#への期待きたい。アンダースからの返答へんとう

公式こうしき発表はっぴょう

[編集へんしゅう]
  1. ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa C# の歴史れきし”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  2. ^ Visual Studio 2017 バージョン 15.0 リリース ノート”. Microsoft Docs. 2021ねん1がつ23にち閲覧えつらん
  3. ^ Visual Studio 2017 15.3 Release Notes”. Microsoft Docs. 2018ねん11月12にち閲覧えつらん
  4. ^ Visual Studio 2017 15.5 Release Notes”. Microsoft Docs. 2018ねん11月12にち閲覧えつらん
  5. ^ Visual Studio 2017 15.7 Release Notes”. Microsoft Docs. 2018ねん8がつ24閲覧えつらん
  6. ^ Visual Studio 2019 Release Notes”. Microsoft Docs. 2019ねん9がつ30にち閲覧えつらん
  7. ^ Visual Studio 2019 Release Notes”. Microsoft Docs. 2020ねん11がつ10日とおか閲覧えつらん
  8. ^ What's new in C# 10” (英語えいご). docs.microsoft.com. 2022ねん6がつ28にち閲覧えつらん
  9. ^ Visual Studio 2022 version 17.0 Release Notes”. docs.microsoft.com. 2022ねん6がつ28にち閲覧えつらん
  10. ^ a b C# 11 のしん機能きのう”. Microsoft Learn. 2023ねん8がつ15にち閲覧えつらん
  11. ^ a b c .NET 7 is Available Today” (英語えいご). .NET Blog. 2023ねん8がつ15にち閲覧えつらん
  12. ^ Visual Studio 2022 バージョン 17.4 リリース ノート”. Microsoft Learn. 2023ねん8がつ15にち閲覧えつらん
  13. ^ a b C# 12 のしん機能きのう”. Microsoft Learn. 2023ねん12月19にち閲覧えつらん
  14. ^ a b c Announcing .NET 8” (英語えいご). .NET Blog. 2023ねん12月19にち閲覧えつらん
  15. ^ Visual Studio 2022 バージョン 17.8 リリース ノート”. Microsoft Learn. 2023ねん12月19にち閲覧えつらん
  16. ^ 2-2 変数へんすう定数ていすう”. Microsoft Docs. 2018ねん11月11にち閲覧えつらん
  17. ^ .NET での文字もじエンコード”. Microsoft Docs. 2018ねん11月11にち閲覧えつらん
  18. ^ 拡張かくちょうメソッド (C# プログラミング ガイド)”. Microsoft Docs. 2018ねん11がつ10日とおか閲覧えつらん
  19. ^ a b c d e f g h i j k l C# 6 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  20. ^ a b c d e C# 7.0 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  21. ^ switch (C# リファレンス)”. Microsoft Docs. 2017ねん9がつ10日とおか閲覧えつらん
  22. ^ a b C# 7.1 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  23. ^ C# 7.2 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  24. ^ C# 7.3 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  25. ^ C# 8.0 のしん機能きのう”. Microsoft Docs. 2019ねん12月12にち閲覧えつらん
  26. ^ What's new in C# 9.0”. Microsoft Docs. 2021ねん10がつ17にち閲覧えつらん
  27. ^ What's new in C# 10.0”. Microsoft Docs. 2022ねん11月3にち閲覧えつらん
  28. ^ リスト パターン”. Microsoft Learn. 2023ねん8がつ15にち閲覧えつらん
  29. ^ ジェネリックがた数値すうち演算えんざん”. Microsoft Learn. 2024ねん5がつ30にち閲覧えつらん
  30. ^ 静的せいてき抽象ちゅうしょうおよび仮想かそうメンバー”. Microsoft Learn. 2024ねん5がつ30にち閲覧えつらん
  31. ^ チュートリアル: C# 11 の機能きのう調しらべる - インターフェイスの静的せいてき仮想かそうメンバー”. Microsoft Learn. 2024ねん5がつ30にち閲覧えつらん
  32. ^ IAdditionOperators<TSelf,TOther,TResult> インターフェイス”. Microsoft Learn. 2024ねん5がつ30にち閲覧えつらん

個人こじんサイト

[編集へんしゅう]
  1. ^ a b c d C# 1.0 - C# によるプログラミング入門にゅうもん”. 2021ねん1がつ23にち閲覧えつらん
  2. ^ C# 2.0 のしん機能きのう - C# によるプログラミング入門にゅうもん”. 2021ねん1がつ23にち閲覧えつらん
  3. ^ C# 4.0 のしん機能きのう - C# によるプログラミング入門にゅうもん”. 2021ねん1がつ23にち閲覧えつらん
  4. ^ C# 5.0 のしん機能きのう - C# によるプログラミング入門にゅうもん”. 2021ねん1がつ23にち閲覧えつらん
  5. ^ C# 7.3 のしん機能きのう - C# によるプログラミング入門にゅうもん”. 2021ねん1がつ23にち閲覧えつらん
  6. ^ a b c d e C# 11.0 のしん機能きのう - C# によるプログラミング入門にゅうもん”. ++C++; // 確認かくにん飛行ひこう C. 2023ねん8がつ15にち閲覧えつらん
  7. ^ a b c d C# 12.0 のしん機能きのう - C# によるプログラミング入門にゅうもん”. ++C++; // 確認かくにん飛行ひこう C. 2023ねん12月19にち閲覧えつらん
  8. ^ パターン マッチング - C# によるプログラミング入門にゅうもん”. 2023ねん12月23にち閲覧えつらん
  9. ^ C# 9.0 のしん機能きのう - C# によるプログラミング入門にゅうもん” (2020ねん5がつ9にち). 2023ねん12月23にち閲覧えつらん
  10. ^ リスト パターン”. ++C++; // 確認かくにん飛行ひこう C. 2023ねん8がつ15にち閲覧えつらん
  11. ^ 【Generic Math】 C# 11 での演算えんざんしん機能きのう”. ++C++; // 確認かくにん飛行ひこう C. 2024ねん5がつ30にち閲覧えつらん

参考さんこう文献ぶんけん

[編集へんしゅう]
  • 高橋たかはし しのぶ「C# 2.0のあたらしい言語げんご仕様しよう」『C MAGAZINE(2005ねん2がつごう)』だい17かんだい2ごう、ソフトバンク パブリッシング。 
  • 山田やまださちひろし独習どくしゅうC#』(だい5はんしょうおよげしゃ独習どくしゅう〉、2022ねん7がつ21にちISBN 978-4-7981-7556-0 

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]