| C# | |
|---|---|
| パラダイム | マルチパラダイム:構造化、命令型、オブジェクト指向、イベント駆動型、タスク駆動型、関数型、汎用、反射型、並行型 |
| 家族 | C |
| デザイン: | アンダース・ヘルスバーグ(マイクロソフト) |
| 開発者 | マッツ・トルガーセン(マイクロソフト) |
| 初登場 | 2000年[ 1 ] (2000年) |
| 安定版リリース | |
| タイピングの規律 | 静的、動的、[ 3 ] 強い、安全な、主格、部分的に推論された |
| メモリ管理 | ガベージコレクション |
| プラットフォーム | 共通言語インフラストラクチャ |
| ライセンス | |
| ファイル名拡張子 | .cs、.csx |
| Webサイト | |
| 主要な実装 | |
| Visual C#、. NET、Mono、ユニバーサル Windows プラットフォーム (廃止):. NET Framework、DotGNU | |
| 方言 | |
| Cω、ポリフォニック C#、拡張 C# | |
| 影響を受けた | |
| C++、[ 6 ] Cω、Eiffel、F#、[ a ] Haskell、Scala、Icon、J#、J++、Java、[ 6 ] JavaScript、ML、Modula-3、Object Pascal、[ 7 ] VB | |
| 影響を受けた | |
| チャペル、[ 8 ] Clojure、[ 9 ] Crystal、[ 10 ] D、J#、Dart、[ 11 ] F#、Hack、Java、[ 12 ] [ 13 ] Kotlin、Nemerle、Oxygene、Rust、[ 14 ] Swift、[ 15 ] Vala、TypeScript | |
| |
C#(/ ˌ s iː ˈ ʃ ɑːr p / 参照SHARP)[ b ]は、複数のパラダイムをサポートする汎用の 高水準 プログラミング言語です。C#は、静的型付け、[ 16 ] : 4 強い型付け、レキシカルスコープ、命令型、宣言型、関数型、ジェネリック、[ 16 ] : 22 オブジェクト指向(クラスベース)、およびコンポーネント指向のプログラミング手法を網羅しています。[ 17 ]
C#プログラミング言語の主な設計者は、MicrosoftのAnders Hejlsberg、Scott Wiltamuth、およびPeter Goldeでした。[ 17 ] C#は2000年7月に初めて広く配布され[ 17 ]、その後、2002年にEcma (ECMA-334)、2003年にISO / IEC(ISO/IEC 23270および20619 [ c ])によって国際標準として承認されました。Microsoftは、技術的に言えば、クローズドソースである.NET FrameworkおよびMicrosoft Visual StudioとともにC#を導入しました。当時、Microsoftにはオープンソース製品はありませんでした。4年後の2004年に、Monoと呼ばれる無料のオープンソースプロジェクトが開始され、C#プログラミング言語用のクロスプラットフォームコンパイラとランタイム環境が提供されました。 10年後、MicrosoftはVisual Studio Code(コードエディタ)、Roslyn(コンパイラ)、そして統合.NETプラットフォーム(ソフトウェアフレームワーク)をリリースしました。これらはすべてC#をサポートし、無料、オープンソース、クロスプラットフォームです。MonoもMicrosoftに加わりましたが、.NETには統合されませんでした。
2025年11月現在、[アップデート]この言語の最新の安定バージョンはC# 14です。[ 18 ] [ 19 ] [ 20 ]
設計目標
[編集]Ecma標準ではC#の設計目標として以下を挙げている: [ 17 ]
- この言語は、シンプルで現代的な汎用オブジェクト指向プログラミング言語となることを目指しています。
- 言語とその実装は、強力な型チェック、配列境界チェック、[ 21 ] : 58–59 初期化されていない変数の使用試行の検出、自動ガベージコレクションなどのソフトウェアエンジニアリングの原則をサポートする必要があります。[ 21 ] : 563 ソフトウェアの堅牢性、耐久性、およびプログラマの生産性が重要です。
- この言語は、分散環境での展開に適したソフトウェア コンポーネントの開発に使用することを目的としています。
- 移植性は、ソース コードとプログラマー、特にCとC++にすでに精通しているプログラマーにとって非常に重要です。
- 国際化への対応[ 21 ]:314 は非常に重要です。
- C# は、高度なオペレーティング システムを使用する非常に大規模なものから、専用の機能を持つ非常に小規模なものまで、ホスト システムと組み込みシステムの両方のアプリケーションの作成に適しているように設計されています。
- C#アプリケーションはメモリと処理能力の要件に関して経済的になるように設計されていますが、この言語はパフォーマンスとサイズに関してCやアセンブリ言語と直接競合することを意図していませんでした。[ 22 ]
歴史
[編集].NET Frameworkの開発中、クラスライブラリは当初、Simple Managed C (SMC)と呼ばれるマネージコードコンパイラシステムを使用して記述されていました。 [ 23 ] [ 24 ] 1999年1月、Anders Hejlsbergは当時「 C-like Object Oriented Language(C風オブジェクト指向言語)」の略称であるCOOLと呼ばれる新しい言語を開発するためのチームを結成しました。[ 25 ]
マイクロソフトは当初、「COOL(C-like Object Oriented Language)」という名称を言語の最終名称として維持することを検討していましたが、商標上の理由から断念しました。2000年7月のProfessional Developers Conferenceで.NETプロジェクトが発表された時点で、言語名はC#に変更され、クラスライブラリとASP.NETランタイムはC#に移植されていました。[要出典]
ヘルズバーグはマイクロソフトでC#の主任設計者兼リードアーキテクトを務め、以前はTurbo Pascal、Embarcadero Delphi(旧CodeGear Delphi、Inprise Delphi、Borland Delphi)、Visual J++の設計に携わっていました。インタビューや技術論文の中で、彼は主要なプログラミング言語(C++、Java、Delphi、Smalltalkなど)の欠陥が共通言語ランタイム(CLR)の基礎を決定づけ、それがC#言語の設計を決定づけたと述べています。[ 26 ]
1994年にJavaプログラミング言語を作成したジェームズ・ゴスリングと、Javaの生みの親であるサン・マイクロシステムズの共同設立者であるビル・ジョイは、C#をJavaの「模倣」と呼び、ゴスリングはさらに「[C#は]信頼性、生産性、セキュリティが削除された一種のJavaです」と述べました。[ 27 ] [ 28 ]
2000年7月、HejlsbergはC#は「Javaのクローンではない」、その設計は「C++に非常に近い」と述べた。[ 29 ]
2005年11月のC# 2.0のリリース以来、C#とJava言語はますます異なる軌跡を辿り、全く異なる言語へと進化を遂げてきました。最初の大きな変化の一つは、両言語にジェネリックが追加されたことですが、その実装は大きく異なっていました。C#は具象化を用いて、他のクラスと同様に使用できる「ファーストクラス」のジェネリックオブジェクトを提供し、クラスのロード時にコード生成が行われます。[ 30 ]
C#には関数型プログラミングに対応するための主要な機能がいくつか追加されており、その集大成としてC# 3.0でリリースされたLINQ拡張機能と、それをサポートするラムダ式、拡張メソッド、匿名型のフレームワークが登場しました。[ 31 ]これらの機能により、C#プログラマはクロージャなどの関数型プログラミング手法を、アプリケーションにとって都合の良い場合に使用できます。LINQ拡張機能と関数型インポートにより、開発者はデータベースのクエリ、XMLファイルの解析、データ構造の検索などの一般的なタスクに含まれる定型コードの量を削減し、実際のプログラムロジックに重点を移して読みやすさと保守性を向上させることができます。[ 32 ]
C#にはかつてAndy( Anders Hejlsbergにちなんで名付けられた)というマスコットキャラクターがいましたが、2004年1月29日に廃止されました。[ 33 ]
C#は当初、ISO/ IEC 23270:2003に基づいてISO/IEC JTC 1小委員会SC 22にレビューのために提出されましたが、[ 34 ] 、 [ 35 ]、撤回され、その後ISO/IEC 23270:2006に基づいて承認されました。[ 36 ] 23270:2006は23270:2018に基づいて撤回され、このバージョンで承認されました。[ 37 ]
名前
[編集]マイクロソフトは1988年に、増分コンパイル用に設計されたC言語の派生版に初めてC#という名前を使用しました。[ 38 ]そのプロジェクトは完了せず、後にその名前が再利用されました。
「Cシャープ」という名称は、楽譜のシャープ記号が半音高い音程を表すことに由来しています。[ 39 ]これはC++ という言語名にも似ており、「++」は変数が評価後に1ずつ増加することを示します。シャープ記号は4つの「+」記号(2行2列のグリッド)の合字にも似ており、この言語がC++の増分であることをさらに示唆しています。[ 40 ]
表示の技術的な制限(標準フォント、ブラウザなど)と、ほとんどのキーボードレイアウトにシャープ記号(U+266F #MUSIC SHARP SIGN(♯))がないため、プログラミング言語の表記名のシャープ記号に近似するためにナンバー記号(U+0023 # NUMBER SIGN(#))が選択されました。[ 41 ] この規則はECMA-334 C#言語仕様に反映されています。[ 17 ]
「シャープ」という接尾辞は、J# ( Java 1.1から派生したMicrosoftによって設計された.NET言語)、A#(Adaから)、関数型プログラミング言語F#など、既存の言語のバリエーションである他の多くのMicrosoft .NET互換/準拠言語でも使用されています。[ 42 ] Eiffelの.NET向けのオリジナルの実装はEiffel #と呼ばれていましたが、[ 43 ] Eiffel言語全体がサポートされたため、この名前は廃止されました。この接尾辞は、 Gtk# ( GTKおよびその他のGNOMEライブラリ用の.NETラッパー)やCocoa# ( Cocoa用のラッパー)などのライブラリにも使用されています。
バージョン
[編集]標準規格(C# 6以降)のテキスト開発はGitHubで行われています。C# 7はEcmaに提出され、2023年12月に承認されました。2024年1月現在、C# 8の標準規格は承認された言語提案を参照しながら開発中です。
構文
[編集]C# 言語のコア構文は、C、Objective-C、C++、Java などの他の C スタイル言語の構文と似ています。特に次の点が異なります。
- セミコロンは文の終わりを示すために使用されます。
- 中括弧は文をグループ化するために使用されます。文は通常、メソッド(関数)にグループ化され、メソッドはクラスにグループ化され、クラスは名前空間にグループ化されます。
- 変数は等号を使用して割り当てられますが、比較には連続する 2 つの等号が使用されます。
- 角括弧は配列とともに使用され、配列を宣言するだけでなく、配列内の特定のインデックスにある値を取得するためにも使用されます。
- 「class」、「int」、および「void」は、ほとんどの場合、C スタイルのコンピュータ プログラミング言語のスクリプト内の大規模な (通常はメイン) プログラム関数を定義するために使用されます。
特徴的な特徴
[編集]C# と C、C++、Java を区別する注目すべき機能は次のとおりです。
携帯性
[編集]C#は設計上、基盤となる共通言語基盤 (CLI)を最も直接的に反映するプログラミング言語です。[ 71 ]その組み込み型のほとんどは、CLI(共通言語基盤)フレームワーク によって実装された値型に対応しています。しかし、言語仕様ではコンパイラのコード生成要件は規定されていません。つまり、C#コンパイラが共通言語ランタイム(CLR)をターゲットにしたり、共通中間言語(CIL)を生成したり、その他の特定の形式を生成したりする必要はありません。一部のC#コンパイラは、Objective-C、C、C++、アセンブリ、 Fortranの従来のコンパイラと同様に、マシンコードを生成することもできます。[ 72 ] [ 73 ]
タイピング
[編集]C#は、キーワードを使用した暗黙的に強く型付けされた変数宣言と、キーワードvarに続くコレクション初期化子を使用した暗黙的に型付けされた配列をサポートしています。[ 16 ] : 80 [ 21 ] : 58 new[]
その型システムは2つのファミリーに分かれています。組み込みの数値型やユーザー定義構造体などの値型は、パラメータとして使用された場合、自動的にコピーとして渡されます。参照型には、配列、クラスのインスタンス、文字列などがあり、それぞれのオブジェクトへのポインタのみを渡します。等価演算子の特別な処理と不変性のため、文字列は実用上は値のように動作します。プログラマは、それらをcaseラベルとして使用することもできます。必要に応じて、値型は自動的にボックス化されます。[ 74 ]
C#は厳密なブールデータ型をサポートしています。やなどboolの条件文では、ブール値に評価される型の式が必要です。C++にもブール型がありますが、これは整数との間で自由に変換できます。 などの式では、がブール型に変換可能で、 がint またはポインターであることが必須です。C#では、この「整数は真または偽を意味する」というアプローチは許可されていません。これは、プログラマーに正確に真または偽を返す式の使用を強制することで、(等号ではなく代入を使用する)などの特定のプログラミングミスを防ぐことができるという理由からです。
whileiftrueif (a)aaboolif (a = b)===
C#はC++よりも型安全です。デフォルトで暗黙的な変換が行われるのは、整数の拡大など、安全とみなされるものだけです。これはコンパイル時、ジャストインタイムコンパイル時、そして場合によっては実行時に強制されます。ブール値と整数の間、また列挙型メンバーと整数の間では暗黙的な変換は行われません(ただし、リテラル0は暗黙的に任意の列挙型に変換できます)。ユーザー定義の変換は、デフォルトで暗黙的であるC++のコピーコンストラクタや変換演算子とは異なり、明示的または暗黙的として明示的にマークする必要があります。
C#はジェネリック型の共変性と反変性を明示的にサポートしていますが、 [ 16 ] : 144 [ 21 ] : 23、 C++では仮想メソッドの戻り値の型のセマンティクスを通じて反変性をある程度サポートしているのとは異なります。
C#言語ではグローバル変数や関数は使用できません。すべてのメソッドとメンバーはクラス内で宣言する必要があります。パブリッククラスの静的メンバーは、グローバル変数や関数の代わりに使用できます。
ローカル変数は、C や C++ とは異なり、囲んでいるブロックの変数 をシャドウすることはできませんが、型レベルの名前をシャドウすることはできます。
メタプログラミング
[編集]メタプログラミングはいくつかの方法で実現できます。
- リフレクションは .NET API を通じてサポートされており、型メタデータの検査や動的メソッドの呼び出しなどのシナリオが可能になります。
- 式木[ 75 ]はコードを抽象構文木として表現します。各ノードは検査または実行可能な式です。これにより、実行時に実行可能コードを動的に変更することが可能になります。式木は言語に同図像性をもたらします。
- C#の用語では、属性とは型、メンバー、またはアセンブリ全体に付加できるメタデータであり、Javaのアノテーションに相当します。属性はコンパイラとコードの両方からリフレクションを通じてアクセス可能であり、動作を調整することができます。[ 76 ]ネイティブ属性の多くは、GCCやVisualC++のプラットフォーム依存のプリプロセッサディレクティブの機能を複製します。[要出典]
System.Reflection.Emit名前空間[ 77 ]には実行時にメタデータとCIL(型、アセンブリなど)を出力するクラスが含まれています。- .NETコンパイラプラットフォーム(Roslyn)は、言語コンパイルサービスへのAPIアクセスを提供し、.NETアプリケーション内からC#コードをコンパイルすることを可能にします。コードの構文解析(字句解析)、意味解析、CILへの動的コンパイル、そしてコード出力のためのAPIを公開しています。[ 78 ]
- ソースジェネレーター[ 79 ]は、Roslyn C#コンパイラの機能であり、コンパイル時のメタプログラミングを可能にします。コンパイルプロセス中に、開発者はコンパイラのAPIを使用してコンパイル中のコードを検査し、生成された追加のC#ソースコードをコンパイル対象として渡すことができます。
メソッドと関数
[編集]C# におけるメソッドは、単にフィールドの値保持機能(クラスまたはインスタンス変数)ではなく、関数として呼び出すことができるクラスのメンバーです。 [ 80 ] C++やANSI Cなどの他の構文が類似した言語と同様に、メソッドのシグネチャは宣言であり、順に、任意のアクセシビリティ キーワード ( など)、戻り値の型の明示的な指定 ( 、または値が返されない場合はキーワードなど)、メソッドの名前、最後に、コンマで区切られたパラメータ指定の括弧で囲まれたシーケンス (各パラメータはパラメータの型、正式な名前、およびオプションで、何も提供されない場合に使用される既定値から構成されます) で構成されます。他のほとんどの言語とは異なり、参照呼び出しパラメータは関数定義と呼び出し元の両方でマークする必要があり、プログラマはとを選択できます。後者を使用すると、戻り値に明確な値を持つ初期化されていない変数を渡すことができる[ 81 ]さらに、プログラマは最後のパラメータにキーワードを適用することで可変長の引数リストを指定することができます。 [ 82 ]フィールドの値を返したり代入したりして単純に取得したり設定したりするような特定の種類のメソッドでは、明示的に記述された完全なシグネチャは必要ありませんが、一般的には、クラスの定義にはメソッドの完全なシグネチャ宣言が含まれています。[ 83 ]privateintvoidrefoutparams
C++と同様に、Javaとは異なり、C#プログラマーはサブクラスによるメソッドのオーバーライドvirtualを可能にするために、スコープ修飾子キーワードを使用する必要があります。C++とは異なり、プログラマーはオーバーライドする際にキーワードを明示的に指定する必要があります。[ 84 ]これは、オーバーライドと関数の新規オーバーロード(つまり、前者の実装を隠蔽すること)との混同を避けるためのものです。後者を行うには、プログラマーはキーワードを指定する必要があります。[ 85 ]このキーワードは、個々のメソッドまたはクラス全体に対するさらなるオーバーライドを禁止するために使用できます。[ 86 ]overridenewsealed
C#の拡張メソッドを使用すると、プログラマーは静的メソッドをクラスのメソッドテーブルのメソッドのように使用することができ、その種のオブジェクト(およびそれぞれの派生クラスのインスタンス)に存在すると思われるインスタンスメソッドをクラスに仮想的に追加することができます。[ 16 ]:103–105 [ 21 ]:202–203
この型はdynamic実行時のメソッドバインディングを可能にし、JavaScriptのようなメソッド呼び出しと実行時のオブジェクト合成を可能にします。[ 16 ]:114–118
C#は、キーワード を介して強く型付けされた関数ポインタをサポートしていますdelegate。Qtフレームワークの擬似C ++シグナルやスロットと同様に、C#はパブリッシュ・サブスクライブ型のイベントに特化したセマンティクスを備えていますが、C#ではデリゲートを使用してこれを行います。フィールドとは異なり、event変数はインターフェースの一部となることができます。これは、変数が技術的に、呼び出されるデリゲートを追加および削除するための2つのデフォルト関数から構成されているためです。
synchronizedC# は、属性 を介してJava のようなメソッド呼び出しを提供し、キーワード を介して相互排他ロック[MethodImpl(MethodImplOptions.Synchronized)]をサポートします。
lock
プロパティ
[編集]C#はプロパティを持つクラスをサポートしています。プロパティは、バッキングフィールドを持つ単純なアクセサ関数、または任意のゲッター関数とセッター関数を実装できます。セッター関数がない場合、プロパティは読み取り専用です。フィールドと同様に、クラスプロパティとインスタンスプロパティがあります。基になるメソッドは、他のメソッドと同様にvirtual、またはですabstract。[ 83 ]
C# 3.0以降では自動実装プロパティの構文糖衣が利用可能であり、 [ 87 ]アクセサー(ゲッター)とミューテーター(セッター)がクラスの単一フィールドに対する操作をカプセル化します。
名前空間
[編集]AC#namespaceはJavapackageやC++と同等のコード分離レベルを提供しnamespace、ルールや機能はC++と非常によく似ていますpackage。名前空間は「using」構文でインポートできます。[ 88 ]
メモリアクセス
[編集]C#では、メモリアドレスポインタは、特にunsafeとマークされたブロック内でのみ使用可能であり、[ 89 ] unsafeコードを含むプログラムを実行するには適切な権限が必要である。ほとんどのオブジェクトアクセスは、常に「ライブ」オブジェクトを指すか、明確に定義されたnull値を持つ安全なオブジェクト参照を介して行われる。つまり、「デッド」オブジェクト(ガベージコレクションされたオブジェクト)や任意のメモリブロックへの参照を取得することは不可能である。unsafeポインタは、クラスインスタンス、配列、文字列など、ガベージコレクションの対象となるオブジェクトへの参照を含まないアンマネージ値型のインスタンスを指すことができる。unsafeとしてマークされていないコードは、そのSystem.IntPtr型を介してポインタを格納および操作することはできるが、逆参照することはできない。
マネージドメモリは明示的に解放することはできません。代わりに、自動的にガベージコレクションされます。ガベージコレクションは、ほとんどの場合不要になったメモリを解放する責任からプログラマーを解放することで、メモリリークの問題に対処します。オブジェクトへの参照を必要以上に長く保持するコードは、依然として必要以上にメモリを消費する可能性がありますが、オブジェクトへの最後の参照が解放されると、そのメモリはガベージコレクションに使用できるようになります。
例外
[編集]プログラマーは様々な標準例外を利用できます。標準ライブラリのメソッドは、特定の状況下で定期的にシステム例外をスローし、スローされる例外の種類は通常ドキュメント化されています。クラスにはカスタム例外クラスを定義することで、必要に応じて特定の状況に応じた処理を施すことができます。[ 90 ]
例外を処理するための構文は次のとおりです。
try
{
// 何か} catch ( Exception ex ) { // エラーの場合はこれを実行する} finally { // エラーの発生に関係なく常に実行する}
ほとんどの場合、これは「try」関数と「catch」関数が使用され、すべての C# バージョンでアクセス可能であるため、「try-catch」コード ブロックと呼ばれます。
試す
{
// ここに何か
}
catch (例外ex )
{
// 例
0を返します。
}
ついに
{
1を返します。
}
計画によっては、「finally」部分を省略できます。エラーの詳細を調べる必要がない場合は、(Exception ex)パラメータも省略できます。また、異なる種類の例外を処理するために、複数の「catch」部分を設けることもできます。[ 91 ]
C#にはチェック例外は存在しません(Javaとは対照的です)。これは、スケーラビリティとバージョン管理の問題を考慮した意図的な決定です。[ 92 ]
多態性
[編集]C++とは異なり、C#は多重継承をサポートしていませんが、クラスは任意の数の「インターフェース」(完全抽象クラス)を実装できます。これは、言語のリードアーキテクトが、複雑さを回避し、CLI全体のアーキテクチャ要件を簡素化するために行った設計上の決定です。
同じ名前のメソッドを含み、同じ順序で同じ型のパラメータ(つまり、同じシグネチャ)を取る複数のインターフェースを実装する場合、Javaと同様に、C# では単一のメソッドですべてのインターフェースをカバーすることも、必要に応じてインターフェースごとに特定のメソッドを使用することもできます。
C#では関数オーバーロード(別名アドホックポリモーフィズム)も提供されており、同じ名前のメソッドでもシグネチャを区別することができます。[ 93 ] Javaとは異なり、C#では演算子オーバーロードもサポートされています。[ 94 ]
C#バージョン2.0以降、パラメトリック多態性、つまり任意または制約付きの型パラメータを持つクラス(例えばList<T>、 型の要素のみを含む可変サイズの配列)が提供されていますT。プログラマーは型パラメータに対して、次のような制約を指定できます。X型(またはその派生型)であること、特定のインターフェースを実装していること、参照型であること、値型であること、パブリックなパラメータなしのコンストラクタを実装していること。これらのほとんどは組み合わせることができ、任意の数のインターフェースを指定できます。[ 95 ] [ 96 ]
統合言語クエリ (LINQ)
[編集]C#は.NET Frameworkを通じてLINQを利用できます。IEnumerable<T>オブジェクトにインターフェースが実装されていれば、開発者は様々なデータソースに対してクエリを実行できます。これにはXMLドキュメント、ADO.NETデータセット、SQLデータベースなどが含まれます。[ 97 ]
C#でLINQを使用すると、 IntelliSenseのサポート、強力なフィルタリング機能、コンパイルエラーチェック機能による型の安全性、さまざまなソースに対するデータのクエリの一貫性などの利点が得られます。[ 98 ] C#とLINQで利用できる言語構造には、クエリ式、ラムダ式、匿名型、暗黙的に型指定された変数、拡張メソッド、オブジェクト初期化子などがあります。[ 99 ]
LINQにはクエリ構文とメソッド構文の2つの構文があります。ただし、コンパイラは常にコンパイル時にクエリ構文をメソッド構文に変換します。[ 100 ]
System.Linqを使用します。
var numbers =新しいint [] { 5 、10 、8 、3 、6 、12 };
// クエリ構文 (SELECT num FROM numbers WHERE num % 2 = 0 ORDER BY num)
var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num ;
// メソッド構文
var numQuery2 = numbers 。ここで( num => num % 2 == 0 )です。OrderBy ( n => n );
関数型プログラミング
[編集]C#は主に命令型の言語ですが、時間の経過とともに常に関数型機能が追加されています。[ 101 ] [ 102 ]たとえば、次のようになります。
- 第一級市民としての機能– C# 1.0 デリゲート[ 103 ]
- 高階関数– C# 1.0 とデリゲート
- 匿名関数– C# 2 匿名デリゲートとC# 3 ラムダ式[ 104 ]
- クロージャ– C# 2 と匿名デリゲート、C# 3 とラムダ式[ 104 ]
- 型推論– 暗黙的に型付けされたローカル変数
varと C# 9 のターゲット型 new 式を備えたC# 3new() - リストの内包表記– C# 3 LINQ
- タプル– .NET Framework 4.0 で導入されましたが、C# 7.0 で言語サポート付きの新しいタプル型が導入されて人気が高まりました[ 105 ]
- ネストされた関数– C# 7.0 [ 105 ]
- パターンマッチング– C# 7.0 [ 105 ]
- 不変性– C# 7.2 読み取り専用構造体 C# 9 レコード型[ 106 ]および Init 専用セッター[ 107 ]
- 型クラス– C# 12 のロール/拡張機能(開発中[ 108 ])
共通型システム
[編集]C#には統一された型システムがあります。この統一された型システムは共通型システム(CTS)と呼ばれます。[ 109 ]:パート2、第4章:型システム
統一型システムとは、整数などのプリミティブ型を含むすべての型が、そのクラスのサブクラスであることを意味します。例えば、すべての型はメソッドを継承します。
System.ObjectToString()
データ型のカテゴリ
[編集]CTSはデータ型を2つのカテゴリに分類します。[ 109 ]
- 参照タイプ
- 値の型
値型のインスタンスには、参照同一性も参照比較セマンティクスもありません。値型の等価比較と不等価比較では、対応する演算子がオーバーロードされていない限り、インスタンス内の実際のデータ値を比較します。値型は から派生され、常に既定値を持ち、いつでも作成およびコピーできます。値型に関するその他の制限としては、相互に派生できないこと (ただし、インターフェイスを実装することはできます)、および明示的な既定 (パラメーターなし) コンストラクターを持つことができないことが挙げられます。これは、値型にはすでに含まれているすべてのデータを型に依存する既定値 (0、null など) に初期化する暗黙的なコンストラクターがあるためです。値型の例としては、すべてプリミティブ型で、 (符号付き 32 ビット整数)、(32 ビット IEEE 浮動小数点数)、(16 ビット Unicode コード単位)、(通貨量の処理に便利な固定小数点数)、(ナノ秒精度で特定の時点を識別)などがあります。その他の例としては、 (列挙) や(ユーザー定義構造体) などがあります。
System.ValueTypeintfloatchardecimalSystem.DateTimeenumstruct
対照的に、参照型には参照同一性の概念があり、参照型の各インスタンスは、両方のインスタンス内のデータが同じであっても、本質的に他のすべてのインスタンスと異なります。 これは、対応する演算子がオーバーロードされていない限り ( の場合など)、構造的等価性ではなく参照の等価性をテストする参照型のデフォルトの等価性および不等価性の比較に反映されています。 参照型のインスタンスの作成、既存のインスタンスのコピー、または 2 つの既存のインスタンスでの値の比較の実行など、一部の操作は常に可能であるとは限りません。 ただし、特定の参照型は、パブリック コンストラクターを公開するか、対応するインターフェイス ( または など)を実装することによって、このようなサービスを提供できます。 参照型の例としては、 (他のすべての C# クラスの最終的な基本クラス)、(Unicode 文字の文字列)、(すべての C# 配列の基本クラス) などがあります。
System.StringICloneableIComparableobjectSystem.StringSystem.Array
どちらの型カテゴリも、ユーザー定義型によって拡張可能です。
箱詰めと開封
[編集]ボックス化は値型オブジェクトを対応する参照型の値に変換する操作です。[ 109 ] C#でのボックス化は暗黙的です。
アンボックス化とは、参照型(既にボックス化されている)の値を値型の値に変換する操作です。[ 109 ] C#におけるアンボックス化には明示的な型キャストが必要です。T型のボックス化されたオブジェクトは、T(またはnull許容のT)にのみアンボックス化できます。[ 110 ]
例:
int foo = 42 ; //値型。object bar = foo ; // fooは bar にボックス化されます。int foo2 = ( int ) bar ; // 値型にアンボックス化されます。
図書館
[編集]C#仕様では、コンパイラが利用可能であると想定する型とクラスライブラリの最小限のセットが詳細に規定されています。実際には、C#はECMA-335 Common Language Infrastructure (CLI) として標準化されている共通言語基盤(CLI) の実装と組み合わせて使用されることが最も多くなっています。
標準的なCLI仕様に加えて、.NET Frameworkライブラリ上に構築され、追加機能を提供する商用およびコミュニティクラスライブラリが多数存在します。[ 111 ]
C# は、.NET ライブラリおよびフレームワークのリストに含まれる任意のライブラリを呼び出すことができます。
例
[編集]こんにちは世界
[編集]以下は、C# 9で導入されたトップレベルステートメント機能を使用した、古典的な「 Hello World」の例の非常に単純なC#プログラムです。 [ 112 ]
System.Console.WriteLine ( " Hello , World !" ) ;
C# 8 以下で記述されたコードの場合、プログラムのエントリ ポイント ロジックは、型内の Main メソッドに記述する必要があります。
システムを使用します。
クラスProgram { static void Main ( ) { Console.WriteLine ( " Hello, World!" ); } }
このコードは、コンソール ウィンドウに次のテキストを表示します。
こんにちは世界!
各行には目的があります:
システムを使用します。
上記の行は、System名前空間内のすべての型をインポートします。例えば、Consoleソースコード内で後ほど使用するクラスはSystem名前空間内で定義されているため、型の完全な名前(名前空間を含む)を指定せずに使用できます。
// 古典的な「Hello World」プログラムのバージョン
この行はコメントであり、プログラマー向けにコードの説明と文書化を行います。
クラスプログラム
上記はクラスのクラスProgram定義です。括弧で囲まれた部分はすべてそのクラスを記述します。
{
... }
中括弧はコードブロックの境界を区切るものです。この最初の例では、クラスの開始と終了を示していますProgram。
静的voidメイン()
これは、プログラムが実行を開始するクラスメンバーメソッドを宣言します。.NET ランタイムはMainメソッドを呼び出します。Java とは異なり、メソッドには キーワードはMain必要ありません。このキーワードはpublic、メソッドがどのクラスからでもどこからでも呼び出せることをコンパイラに伝えます。[ 113 ]の記述はの記述と同じです。staticキーワードは、 のインスタンスがなくてもメソッドにアクセスできるようにします。各コンソールアプリケーションのエントリポイントを宣言する必要があります。そうでないと、プログラムは のインスタンスを必要としますが、どのインスタンスでもプログラムが必要になります。解決できない循環依存関係を回避するために、コンソールアプリケーションを処理する C# コンパイラ(上記のような) は、メソッドがない場合にエラーを報告します。 キーワードは、 に戻り値がないことを宣言します。(ただし、前述のように、C# 9 で導入された
トップレベルステートメントを使用して短いプログラムを作成できることに注意してください。)static void Main(string[] args)private static void Main(string[] args)ProgramMainstaticProgramstatic MainvoidMain
コンソール.WriteLine ( "Hello, World!" ) ;
この行は出力を書き込みます。は名前空間Consoleの静的クラスですSystem。コンソールアプリケーション用の標準入出力およびエラーストリームへのインターフェースを提供します。プログラムはメソッドを呼び出しConsole、WriteLine引数である文字列を含む行をコンソールに表示します"Hello, World!"。
ジェネリック医薬品
[編集].NET 2.0 と C# 2.0 では、コミュニティは .NET 1.x よりも柔軟なコレクションを利用できるようになりました。ジェネリックが存在しない状況では、開発者は要素を種類が指定されていないオブジェクトとして格納するために ArrayList などのコレクションを使用する必要があり、含まれる項目のボックス化/アンボックス化/型チェックを行う際にパフォーマンスのオーバーヘッドが発生していました。
ジェネリックは.NETに画期的な新機能をもたらし、開発者が型安全なデータ構造を作成できるようになりました。この変化は、レガシーシステムの移行において特に重要です。ジェネリックへの更新は、時代遅れのデータ構造をより効率的で型安全なものに置き換えることで、パフォーマンスと保守性を大幅に向上させることができます。[ 114 ]
例
パブリッククラスDataStore <T> {プライベートT [ ] items = new T [ 10 ] ;プライベートint count = 0 ;
パブリックvoid Add ( T item ) { items [ count ++ ] = item ; }
public T Get ( int index ) {戻り値items [ index ]; } }
標準化とライセンス
[編集]2001 年 8 月、Microsoft、Hewlett-Packard、およびIntel の3 社が共同で、C# および共通言語インフラストラクチャ(CLI) の仕様を標準化団体Ecma Internationalに提出しました。2001 年 12 月、ECMA は ECMA-334 C# 言語仕様を発表しました。C# は2003 年にISO / IEC標準になりました (ISO/IEC 23270:2003 -情報技術 - プログラミング言語 - C# )。ECMA は、2002 年 12 月に、C# の第 2 版として同等の仕様を採用していました。2005 年 6 月、ECMA は C# 仕様の第 3 版を承認し、ECMA-334 を更新しました。追加された内容には、部分クラス、匿名メソッド、null 許容型、ジェネリック(C++テンプレートに多少似ている) などがあります。 2005年7月、ECMAはISO/IEC JTC 1/SC 22のファストトラックプロセスを通じて、標準規格および関連TRを提出しました。このプロセスには通常6~9か月かかります。
C# 言語定義と CLI は、特許請求に対する 合理的かつ差別のないライセンス保護を提供する ISO/IEC およびEcma標準に従って標準化されています。
マイクロソフトは当初、オープンソース開発者が、Open Specific Promiseの対象となるフレームワークの部分について、非営利プロジェクトで特許を侵害しているとして訴訟を起こさないことに同意した。[ 115 ]マイクロソフトはまた、C#、.NET、またはNovellの.NET実装(Monoプロジェクト)を明示的に言及していない製品リストを除き、Novellの有料顧客に対してNovell製品に関連する特許を執行しないことにも同意した。[ 116 ]しかし、 NovellはMonoがマイクロソフトの特許を侵害していないと主張した。[ 118 ]マイクロソフトはまた、Novellを通じて入手されたという条件で、Monoに依存するMoonlightブラウザプラグインに関連する特許権を執行しないという具体的な合意も行った。[ 119 ]
10 年後、マイクロソフトは C# 用の無料、オープンソース、クロスプラットフォームのツール、具体的にはVisual Studio Code、.NET Core、Roslyn の開発を開始しました。Mono は、マイクロソフトの子会社であるXamarinのプロジェクトとしてマイクロソフトに加わりました。
実装
[編集]Microsoft はオープンソースのリファレンス C# コンパイラとツールを開発しました。最初のコンパイラRoslynは中間言語 (IL) にコンパイルし、2 番目のコンパイラ RyuJIT [ 120 ]は JIT (ジャストインタイム) コンパイラで、動的かつオンザフライで最適化を行い、IL を CPU のフロントエンドのネイティブ コードにコンパイルします。[ 121 ] RyuJIT はオープンソースで、C++ で書かれています。[ 122 ] Roslyn は完全にマネージド コード(C#)で書かれており、オープン化されており、機能が API として公開されています。そのため、開発者はリファクタリング ツールや診断ツールを作成できます。[ 4 ] [ 123 ]公式実装には .NET Framework (クローズド ソース、Windows のみ) と .NET Core (オープンソース、クロス プラットフォーム) の 2 つのブランチがあり、最終的に .NET 5.0 という 1 つのオープンソース実装に収束しました。[ 124 ] .NET Framework 4.6では、新しいJITコンパイラが以前のものに取って代わりました。[ 120 ] [ 125 ]
その他の C# コンパイラ (一部には共通言語インフラストラクチャと .NET クラス ライブラリの実装が含まれています):
- Microsoft が後援するプロジェクトであるMono は、オープン ソースの C# コンパイラ、CLI の完全なオープン ソース実装 (ECMA 仕様に記載されている必要なフレームワーク ライブラリを含む)、および .NET Framework 3.5 までの .NET クラス ライブラリのほぼ完全な実装を提供します。
- RemObjectsのElementsツール チェーンには、C# コードを .NET の共通中間言語、Java バイトコード、Cocoa、Android バイトコード、WebAssembly 、および Windows、macOS、Linux のネイティブ マシン コードにコンパイルするRemObjects C# が含まれています。
- DotGNUプロジェクト (現在は中止) では、オープン ソースの C# コンパイラ、ECMA 仕様に記載されている必須フレームワーク ライブラリを含む Common Language Infrastructure のほぼ完全な実装、.NET 2.0 までの残りの Microsoft 独自の .NET クラス ライブラリの一部 (ECMA 仕様では文書化または記載されていないが、Microsoft の標準 .NET Framework ディストリビューションには含まれているもの) のサブセットも提供されていました。
Unityゲームエンジンは、主要なスクリプト言語としてC#を使用しています。Godotゲームエンジンは、 Microsoftからの24,000ドルの寄付により、オプションのC#モジュールを実装しました。[ 126 ]
参照
[編集]- IDE
注記
[編集]- ^ 非同期の場合
- ^ 慣例により、通常のテキストでは2番目の文字にシャープ記号が使用されますが、芸術的な表現では、真のシャープ記号(C#)が使用されることもあります。ただし、 ECMA 334規格では、「C#という名称は、ラテン大文字のC(U+0043)に数字記号#(U+0023)を続けて表記する」と規定されています。
- ^ 言語バージョン1.0、2.0、および5.0はISO/IEC 23270として利用可能です。バージョン7.0以降、仕様はISO/IEC 20619として利用可能です。
- ^ Microsoft C# 2.0 仕様書には、2.0 の新機能のみが記載されています。古い機能については、上記の 1.2 仕様書を参照してください。
参考文献
[編集]引用
[編集]- ^ 「InfoQ eMag: C# 7のプレビュー」。2023年4月24日時点のオリジナルよりアーカイブ。2016年11月11日閲覧。
- ^ 「.NET 10の新機能」 。 2025年11月13日閲覧。
- ^ Torgersen, Mads (2008年10月27日). 「C# 4.0の新機能」 . Microsoft . 2012年1月3日時点のオリジナルよりアーカイブ。2008年10月28日閲覧。
- ^ a b 「Roslyn .NET コンパイラは、C# および Visual Basic 言語に豊富なコード分析 API を提供します。: dotnet/roslyn」。2019年11月13日。 2021年2月22日時点のオリジナルよりアーカイブ。 2015年2月13日閲覧– GitHub経由。
- ^ 「CoreCLRは.NET Coreのランタイムです。ガベージコレクター、JITコンパイラー、プリミティブデータ型、低レベルクラスが含まれています。: dotnet/coreclr」 2019年11月13日。 2019年10月14日時点のオリジナルよりアーカイブ。 2017年3月8日閲覧– GitHub経由。
- ^ a b Naugler, David (2007年5月). 「C# 2.0 for C++ and Java programmer: conference workshop」. Journal of Computing Sciences in Colleges . 22 (5).
C#はJavaから強い影響を受けていますが、C++からも強い影響を受けており、C++とJavaの両方の派生言語として捉えるのが最も適切です。
- ^ Hamilton, Naomi (2008年10月1日). 「プログラミング言語AZ集:C#」 . Computerworld . 2010年3月24日時点のオリジナルよりアーカイブ。2010年2月12日閲覧。
私たちは皆、偉大な先人たちの肩の上に立っており、すべての言語はそれ以前のものの上に構築されているため、C、C++、Java、Delphiなど、私たちの先駆者たちに多大な恩恵を受けています。(
Anders Hejlsberg
)
- ^ 「Chapel spec (Acknowledgments)」(PDF) . Cray Inc. 2015年10月1日. 2016年2月5日時点のオリジナル(PDF)からアーカイブ。 2016年1月14日閲覧。
- ^ “Rich Hickey Q&A by Michael Fogus” . 2017年1月11日時点のオリジナルよりアーカイブ。 2017年1月11日閲覧。
- ^ Borenszweig, Ary (2016年6月14日). 「Crystal 0.18.0 リリース!」 . 2018年12月25日時点のオリジナルよりアーカイブ。 2017年8月7日閲覧。Ruby
やその他の言語(C#、Go、Pythonなど)から大きな影響を受けています。
- ^ 「Web言語とVM:高速コードは常に流行している。(V8、Dart) - Google I/O 2013」。YouTube 。 2013年5月16日。2021年12月21日時点のオリジナルよりアーカイブ。 2013年12月22日閲覧。
- ^ Java 5.0では、類似の(そして競合する)C#言語で導入されたいくつかの新しい言語機能(拡張forループ、オートボクシング、可変引数、アノテーション)が追加されました。 [1] 2011年3月19日アーカイブ、 Wayback Machine [2] 2006年1月7日アーカイブ、 Wayback Machine
- ^ Cornelius, Barry (2005年12月1日). 「Java 5、C#に追いつく」 .オックスフォード大学コンピューティングサービス. 2023年3月6日時点のオリジナルよりアーカイブ。2014年6月18日閲覧。
私の意見では、Java言語にこのような劇的な変化をもたらしたのはC#です。(
Barry Cornelius
)
- ^ “Influences - The Rust Reference” . The Rust Reference . 2019年1月26日時点のオリジナルよりアーカイブ。 2023年4月18日閲覧。
- ^ Lattner, Chris (2014年6月3日). 「Chris Lattnerのホームページ」 . Chris Lattner. 2018年12月25日時点のオリジナルよりアーカイブ。2020年5月12日閲覧。Swift
言語は、言語専門家、ドキュメンテーションの達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディンググループのたゆまぬ努力の成果です。もちろん、この分野の多くの言語が苦労して得た経験からも大きな恩恵を受けており、Objective-C、Rust、Haskell、Ruby、Python、C#、CLUなど、数え切れないほど多くの言語からアイデアを得ています。
- ^ a b c d e f g スキート 2019 .
- ^ a b c d e C#言語仕様(PDF) (第4版). Ecma International . 2006年6月. 2021年4月21日時点のオリジナルよりアーカイブ(PDF) . 2012年1月26日閲覧。
- ^ Wagner, Bill. 「C# 14 の新機能」 . learn.microsoft.com . 2025年9月13日閲覧。
- ^ Dollard, Kathleen (2023年11月14日). 「C# 12 の発表」 . .NET Blog . 2023年11月18日時点のオリジナルよりアーカイブ。2023年11月18日閲覧。
- ^ Seth, Gaurav (2023年11月14日). 「.NET 8の発表」 . .NET Blog . 2023年11月19日時点のオリジナルよりアーカイブ。 2023年11月18日閲覧。
- ^ a b c d e f アルバハリ 2022 .
- ^ 「C#の設計目標」 www.java-samples.com . 2021年10月6日時点のオリジナルよりアーカイブ。2021年10月6日閲覧。
- ^ Zander, Jason (2007年11月21日). “Couple of Historical Facts” . 2020年7月29日時点のオリジナルよりアーカイブ。2025年9月9日閲覧。
- ^ Guthrie, Scott (2006年11月28日). 「ASP.Netは元々どの言語で書かれていたのか?」 2016年6月24日時点のオリジナルよりアーカイブ。 2008年2月21日閲覧。
- ^ Hamilton (2008年10月1日). 「The AZ of Programming Languages: C#」 . Computerworld . 2019年5月18日時点のオリジナルよりアーカイブ。2025年9月9日閲覧。
- ^ “Details” . nilsnaegele.com . 2019年4月7日時点のオリジナルよりアーカイブ。2019年4月7日閲覧。
- ^ 「なぜMicrosoftのC#はそうではないのか」。CNET: CBS Interactive。2002年。2023年8月14日時点のオリジナルよりアーカイブ。2023年9月18日閲覧。
- ^ Joy, Bill (2002年2月7日). 「Microsoftの盲点」 . cnet.com. 2023年8月14日時点のオリジナルよりアーカイブ。 2023年9月18日閲覧。
- ^ Osborn, John (2000年8月1日). 「Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg」 . O'Reilly Media. 2010年1月9日時点のオリジナルよりアーカイブ。 2009年11月14日閲覧。
- ^ 「ジェネリック(C#プログラミングガイド)」。Microsoft。2011年8月26日時点のオリジナルよりアーカイブ。2011年3月21日閲覧。
- ^ Don Box、Anders Hejlsberg (2007年2月). 「LINQ: .NET Language-Integrated Query」 . Microsoft. 2011年8月24日時点のオリジナルよりアーカイブ。2011年3月21日閲覧。
- ^ Mercer, Ian (2010年4月15日). 「関数型プログラミングとLINQが手続き型コードよりも優れている理由」 . abodit.com. 2011年7月11日時点のオリジナルよりアーカイブ。 2011年3月21日閲覧。
- ^ Fernandez, Dan (2004年1月29日). 「Andy Retires」 . Dan Fernandez's Blog . Blogs.msdn.com. 2012年1月19日時点のオリジナルよりアーカイブ。 2012年10月4日閲覧。
- ^ 「技術委員会 - JTC 1/SC 22 - プログラミング言語、その環境、およびシステムソフトウェアインターフェース」 ISO。2012年9月27日時点のオリジナルよりアーカイブ。 2012年10月4日閲覧。
- ^ 「ISO/IEC 23270:2003 - 情報技術 - C#言語仕様」 . Iso.org. 2006年8月23日. 2012年5月8日時点のオリジナルよりアーカイブ。 2012年10月4日閲覧。
- ^ 「ISO/IEC 23270:2006 - 情報技術 - プログラミング言語 - C#」。Iso.org。2012年1月26日。2010年12月6日時点のオリジナルよりアーカイブ。 2012年10月4日閲覧。
- ^ 「SO/IEC 23270:2018 情報技術 - プログラミング言語 - C#」 . ISO . 2020年11月26日閲覧。
- ^ Mariani, Rico (2009年10月5日). 「My History of Visual Studio (Part 1) – Rico Mariani's Performance Tidbits」 . Rico Mariani's Performance Tidbits . 2018年5月27日時点のオリジナルよりアーカイブ。 2018年5月26日閲覧。
- ^ Kovacs, James (2007年9月7日). 「C#/.NET History Lesson」 . 2009年3月6日時点のオリジナルよりアーカイブ。 2009年6月18日閲覧。
- ^ Hejlsberg, Anders (2008年10月1日). 「The AZ of Programming Languages: C#」 . Computerworld . 2015年4月2日時点のオリジナルよりアーカイブ。2014年6月22日閲覧。
- ^ 「Microsoft C# FAQ」 . Microsoft . 2006年2月14日時点のオリジナルよりアーカイブ。2008年3月25日閲覧。
- ^ 「F# FAQ」。Microsoft Research。2009年2月18日時点のオリジナルよりアーカイブ。2009年6月18日閲覧。
- ^ Simon, Raphael; Stapf, Emmanuel; Meyer, Bertrand (2002年6月). 「Full Eiffel on the .NET Framework」 . Microsoft . 2009年7月21日時点のオリジナルよりアーカイブ。2009年6月18日閲覧。
- ^ 「C# 2.0 言語とコンパイラの新機能」。Microsoft。2010年12月18日時点のオリジナルよりアーカイブ。2014年6月11日閲覧。
- ^ Hejlsberg, Anders; Torgersen, Mads (2007年4月30日). 「C# 3.0 の概要」 . Microsoft Developer Network . Microsoft. 2014年6月25日時点のオリジナルよりアーカイブ。2014年6月11日閲覧。
- ^ a b 「.NET 2.0からC# 3.0を使用する」 Danielmoth.com、2007年5月13日。2012年9月29日時点のオリジナルよりアーカイブ。2012年10月4日閲覧。
- ^ Hejlsberg, Anders (2011年9月15日). 「C#とVisual Basicの今後の方向性」 . Channel 9. BUILD2011. Microsoft. 2011年9月23日時点のオリジナルよりアーカイブ。 2011年9月21日閲覧。
- ^ 「C# 5.0 の新機能の紹介」。Microsoft MVP Award Program ブログ。Microsoft。2012年3月26日。2014年6月4日時点のオリジナルよりアーカイブ。2014年6月11日閲覧。
- ^ 「C# 6 および VB 14 の言語機能」 . GitHub . dotnet/roslyn. 2016年1月12日時点のオリジナルよりアーカイブ。2015年2月13日閲覧。
- ^ 「C# 7 の新機能」。Microsoft Docs 。2016年12月21日。2017年11月1日時点のオリジナルよりアーカイブ。
- ^ Torgersen, Mads (2017年3月9日). 「C# 7.0の新機能」 . .NET Blog . Microsoft. 2017年4月11日時点のオリジナルよりアーカイブ。2017年6月9日閲覧。
- ^ “Visual Studio 2017 バージョン 15.0 リリースノート” . Microsoft Learn . 2023年4月11日. 2023年4月20日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ 「C# 7.1 の新機能」。Microsoft Docs。2017年10月10日時点のオリジナルよりアーカイブ。2017年10月9日閲覧。
- ^ “Visual Studio 2017 バージョン 15.3 リリースノート” . Microsoft Learn . 2023年4月11日. 2023年3月21日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ 「C# 7.2 の新機能」。Microsoft Docs。2017年12月1日時点のオリジナルよりアーカイブ。2017年11月26日閲覧。
- ^ “Visual Studio 2017 バージョン 15.5 リリースノート” . Microsoft Learn . 2023年4月11日. 2023年4月20日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ 「C# 7.3 の新機能」。Microsoft Docs。2018年6月23日時点のオリジナルよりアーカイブ。2018年6月23日閲覧。
- ^ “Visual Studio 2017 バージョン 15.7 リリースノート” . Microsoft Learn . 2022年7月13日. 2023年4月20日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ “What's new in C# 8.0” . Microsoft Docs . 2023年3月9日. 2020年9月6日時点のオリジナルよりアーカイブ。2019年4月14日閲覧。
- ^ “Visual Studio 2019 バージョン 16.3 リリースノート” . Microsoft Learn . 2023年4月11日. 2023年4月20日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ BillWagner. 「C# 9.0 の新機能 - C# ガイド」 . Microsoft Learn . 2020年9月5日時点のオリジナルよりアーカイブ。 2020年10月15日閲覧。
- ^ “Visual Studio 2019 バージョン 16.8 リリースノート” . Microsoft Learn . 2023年4月11日. 2023年4月20日時点のオリジナルよりアーカイブ。2023年4月19日閲覧。
- ^ 「C# 10の新機能」。Microsoft Learn。2022年2月8日時点のオリジナルよりアーカイブ。2021年11月10日閲覧。
- ^ 「Visual Studio 2022 バージョン 17.0 リリースノート」。Microsoft Learn。2023年7月16日時点のオリジナルよりアーカイブ。 2023年4月19日閲覧。
- ^ 「C# 11の新機能」。Microsoft Learn。2022年8月15日時点のオリジナルよりアーカイブ。2022年8月8日閲覧。
- ^ 「Visual Studio 2022 バージョン 17.4 リリースノート」。Microsoft Learn。2023年8月6日時点のオリジナルよりアーカイブ。 2023年4月19日閲覧。
- ^ 「C# 12の新機能」。Microsoft Learn。2023年7月20日時点のオリジナルよりアーカイブ。 2023年6月29日閲覧。
- ^ “Visual Studio 2022 バージョン 17.8 リリースノート” . Microsoft Learn . 2024年8月13日. 2024年10月6日時点のオリジナルよりアーカイブ。2024年11月18日閲覧。
- ^ 「C# 13の新機能」。Microsoft Learn。2024年11月13日時点のオリジナルよりアーカイブ。2024年11月18日閲覧。
- ^ “Visual Studio 2022 リリースノート” . Microsoft Learn . 2024年11月12日. 2024年11月12日時点のオリジナルよりアーカイブ。2024年11月18日閲覧。
- ^ Novák et al. 2010 .
- ^ stevewhims; mattwojo (2022年10月20日). 「.NET Nativeでアプリをコンパイルする - UWPアプリケーション」 . learn.microsoft.com . 2023年10月27日時点のオリジナルよりアーカイブ。 2023年10月27日閲覧。
- ^ LakshanF; agocke; Rick-Anderson; et al. (2023年9月12日). 「ネイティブAOT展開の概要 - .NET」 . learn.microsoft.com . 2023年11月11日時点のオリジナルよりアーカイブ。 2023年10月27日閲覧。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク) - ^ 「Types/General、公式C#ドキュメントの一部」。Microsoft 。 2024年3月29日時点のオリジナルよりアーカイブ。2024年4月6日閲覧。
- ^ BillWagner. 「Expression Trees (C#)」 . Microsoft Learn . 2021年5月15日時点のオリジナルよりアーカイブ。2021年5月14日閲覧。
- ^ 「属性クラス」。
- ^ dotnet-bot. 「System.Reflection.Emit Namespace」 . learn.microsoft.com . 2023年4月28日時点のオリジナルよりアーカイブ。 2023年4月28日閲覧。
- ^ McAllister, Neil (2011年10月20日). 「MicrosoftのRoslyn:私たちが知っているコンパイラーの刷新」 InfoWorld . 2022年3月5日時点のオリジナルよりアーカイブ。 2022年3月5日閲覧。
- ^ 「C#ソースジェネレーターの紹介」 . .NET Blog . 2020年4月29日. 2021年5月7日時点のオリジナルよりアーカイブ。2021年5月14日閲覧。
- ^ 「クラス/フィールド、公式C#ドキュメントの一部」。2024年2月7日。
- ^ "out (C# リファレンス)" . 2024年3月30日.
- ^ 「メソッドパラメータ/パラメータ修飾子、公式C#ドキュメントの一部」。2024年5月21日。
- ^ a b 「クラス/プロパティ、公式C#ドキュメントの一部」。2024年2月7日。
- ^ "virtual (C# リファレンス)" . Microsoft Learn . 2021年9月15日. 2018年8月30日時点のオリジナルよりアーカイブ。 2018年4月4日閲覧。
- ^ 「新しい修飾子、公式C#ドキュメントの一部」。2023年4月12日。
- ^ 「抽象クラスとシールクラス、そしてクラスメンバー - C#」。2021年10月27日。
- ^ 「自動実装プロパティ(C#プログラミング ガイド)」。2020年10月29日時点のオリジナルよりアーカイブ。 2020年9月12日閲覧。
- ^ 「using ディレクティブ - C# リファレンス」。Microsoft Docs。2019年4月14日時点のオリジナルよりアーカイブ。 2019年4月14日閲覧。
- ^ BillWagner. 「アンセーフコード、データへのポインター、関数ポインター」 . Microsoft Learn . 2021年7月4日時点のオリジナルよりアーカイブ。 2021年6月20日閲覧。
- ^ 「ユーザー定義の例外を作成する方法」。2021年1月26日時点のオリジナルよりアーカイブ。2020年9月12日閲覧。
- ^ 「例外処理ステートメント(公式C#ドキュメントの一部)」 Microsoft Learn、2023年4月22日。 2024年6月26日閲覧。
- ^ Venners, Bill; Eckel, Bruce (2003年8月18日). 「チェック例外の問題点」 . 2015年2月18日時点のオリジナルよりアーカイブ。2010年3月30日閲覧。
- ^ 「式/オーバーロードの解決、公式C#ドキュメントの一部」。Microsoft Learn。2024年2月7日。 2024年4月7日閲覧。
- ^ BillWagner. 「演算子オーバーロード - C#リファレンス」 . Microsoft Learn . 2021年6月24日時点のオリジナルよりアーカイブ。 2021年6月20日閲覧。
- ^ 「Types/Constructed Types、公式C#ドキュメントの一部」。Microsoft Learn 。 2024年4月7日閲覧。
- ^ 「クラス/型パラメーター制約、公式C#ドキュメントの一部」。Microsoft Learn。2024年2月7日。 2024年4月7日閲覧。
- ^ Zhang, Xue Dong; Teng, Zi Mu; Zhao, Dong Wang (2014年9月). 「.NET Frameworkにおけるデータベースアクセス技術の研究」.応用力学・材料. 644– 650: 3077– 3080. doi : 10.4028/www.scientific.net/AMM.644-650.3077 . S2CID 62201466. ProQuest 1565579768 .
- ^ Otey, Michael (2006年2月). 「LINQ to the Future」. SQL Server Magazine . 第8巻第2号. pp. 17– 21. ProQuest 214859896 .
- ^ Sheldon, William (2010年11月). 「LINQの新機能」. SQL Server Magazine . 第12巻、第11号. pp. 37– 40. ProQuest 770609095 .
- ^ BillWagner (2021年9月15日). 「LINQ (C#) のクエリ構文とメソッド構文」 . learn.microsoft.com . 2023年5月23日時点のオリジナルよりアーカイブ。 2023年5月23日閲覧。
- ^ erikdietrich (2023年3月9日). 「C#の歴史 - C#ガイド」 . learn.microsoft.com . 2023年4月28日時点のオリジナルよりアーカイブ。2023年4月28日閲覧。
- ^ The functional journey of C# - Mads Torgersen - NDC Copenhagen 2022、2022年8月17日、2023年5月15日時点のオリジナルよりアーカイブ。 2023年5月15日閲覧。
- ^ “The Beauty of Closures” . csharpindepth.com . 2023年5月19日時点のオリジナルよりアーカイブ。 2023年4月28日閲覧。
- ^ a b BillWagner. 「匿名関数 - C#プログラミングガイド」 . Microsoft Learn . 2021年4月15日時点のオリジナルよりアーカイブ。 2021年5月15日閲覧。
- ^ a b c 「C# 7.0 の新機能」。Microsoft Docs。2020年8月6日時点のオリジナルよりアーカイブ。2019年4月14日閲覧。
- ^ 「C# 9.0 on the record」 . .NET Blog . 2020年11月10日. 2021年5月15日時点のオリジナルよりアーカイブ。2021年5月15日閲覧。
- ^ BillWagner (2022年6月30日). 「init キーワード - C# リファレンス」 . learn.microsoft.com . 2023年5月19日時点のオリジナルよりアーカイブ。2023年5月19日閲覧。
- ^ The .NET Compiler Platform、.NET Platform、2023年4月28日、2023年4月28日時点のオリジナルよりアーカイブ。 2023年4月28日閲覧。
- ^ a b c d アーチャー 2001 .
- ^ Lippert, Eric (2009年3月19日). 「表現とアイデンティティ」 . Fabulous Adventures In Coding . Blogs.msdn.com. 2011年7月12日時点のオリジナルよりアーカイブ。2012年10月4日閲覧。
- ^ “Framework Libraries” . Microsoft Learn . 2023年4月19日. 2019年7月14日時点のオリジナルよりアーカイブ。2019年7月14日閲覧。
- ^ BillWagner. 「C# 9.0 の新機能 - C# ガイド」 . Microsoft Learn . 2020年9月5日時点のオリジナルよりアーカイブ。 2021年5月14日閲覧。
- ^ BillWagner. 「Main() とコマンドライン引数」 . Microsoft Learn . 2021年8月5日時点のオリジナルよりアーカイブ。 2021年8月5日閲覧。
- ^ 「C#ジェネリックのパワーを解き放つ:包括的なガイド」。2024年4月24日。
- ^ 「オープンソース開発者のための特許誓約」 2023年3月16日. 2017年12月7日時点のオリジナルよりアーカイブ。2017年10月28日閲覧。
- ^ 「特許協力契約 - MicrosoftとNovellの相互運用性コラボレーション」 Microsoft 2006年11月2日。2009年5月17日時点のオリジナルからアーカイブ。2009年7月5日閲覧。Microsoft
は、自身とその子会社(以下総称して「Microsoft」)を代表して、Novellまたはその子会社(以下総称して「Novell」)が配布した対象製品の特定のコピーを使用し、Novellが当該特定のコピーについて(直接または間接的に)収益を得たことを理由として、Novellの顧客およびNovellの子会社の顧客をMicrosoftの対象特許の侵害で訴えないことをここに誓約します。ただし、上記の誓約は、当該顧客による使用が(i)Novellが当該収益の対価として承認した特定のコピーのみであること、および(ii)Novellが当該収益の対価として承認した範囲内であることに限定されます。
- ^ 「定義」 . Microsoft . 2006年11月2日. 2012年11月4日時点のオリジナルよりアーカイブ。2009年7月5日閲覧。
- ^ Steinman, Justin (2006年11月7日). 「Novellがコミュニティからの質問に回答」 . 2013年7月16日時点のオリジナルよりアーカイブ。2009年7月5日閲覧。Mono
はMicrosoftの特許を侵害していないと我々は主張します。
- ^ 「Moonlightの下流受信者に対する契約 - MicrosoftとNovellの相互運用性コラボレーション」 Microsoft 、 2007年9月28日。 2010年9月23日時点のオリジナルよりアーカイブ。2008年3月8日閲覧。
「下流の受信者」とは、Novell から直接または中間の受信者を通じて取得した Moonlight 実装を本来の目的で使用する団体または個人を意味します。Microsoft は、前述の契約を更新 (中止を含む) する権利を留保します。「Moonlight 実装」とは、パーソナル コンピュータ上のブラウザーのプラグインとしてのみ実行され、GPLv3 または同様のライセンスに基づいてライセンスされていない Moonlight 1.0 または Moonlight 1.1 の特定の部分のみを意味します。
- ^ a b “RyuJIT 移行が完了しました!” . microsoft.com . 2018年6月19日. 2019年7月19日時点のオリジナルよりアーカイブ。2021年7月20日閲覧。
- ^ 「マネージド実行プロセス」 . microsoft.com . 2017年12月23日時点のオリジナルよりアーカイブ。2021年7月20日閲覧。
- ^ "coreclr/src/jit/" . github.com . 2019年1月9日時点のオリジナルよりアーカイブ。2021年7月20日閲覧。
- ^ 「C#ガイド」。Microsoft Learn。2022年8月13日時点のオリジナルよりアーカイブ。 2017年7月28日閲覧。
- ^ “5.0.8” . microsoft.com . 2020年4月23日時点のオリジナルよりアーカイブ。2021年7月20日閲覧。
- ^ 「軽減策:新しい64ビットJITコンパイラ」。microsoft.com 。 2018年4月5日時点のオリジナルよりアーカイブ。2021年7月20日閲覧。
- ^ Etcheverry, Ignacio (2017年10月21日). 「GodotにおけるC#の導入」 . Godot Engine . 2018年10月26日時点のオリジナルよりアーカイブ。2018年10月26日閲覧。
出典
[編集]- アルバハリ、ジョセフ (2022). C# 10 in a Nutshell (初版). O'Reilly. ISBN 978-1-098-12195-2。
- Archer, Tom (2001). 「パート2、第4章:型システム」. Inside C# . ワシントン州レドモンド: Microsoft Press. ISBN 0-7356-1288-9。
- ノヴァーク、イシュトヴァン。ベルバート、アンドラス。アダム・グラニッチ。バラシ、ジェルジ。アッティラ、ハイドリク。セラーズ、ミッチェル。ヒラー、ガストン C.モルナール、アグネス。カンジラル、ジョイディップ (2010)。Visual Studio 2010 と .NET 4 の 6 つの機能が一体化。ロックスプレス。ISBN 978-0470499481。
- スキート、ジョン (2019). C# in Depth (第4版). マニング社. ISBN 978-1617294532。
さらに読む
[編集]- ピーター・ドレイトン。アルバハリ、ベン。テッド、ニューワード (2002)。C# 言語ポケット リファレンス。オライリー。ISBN 0-596-00429-X。
- ペッツォルド、チャールズ(2002年)『C#によるMicrosoft Windowsプログラミング』 Microsoft Press. ISBN 0-7356-1370-2。
