コンピュータ プログラミング言語C #では、バージョン 2.0 (ECMA-334 標準の第 3 版および.NET Framework 2.0に対応) でいくつかの新機能が導入されています。これには次のものが含まれます。
C# 2.0 の機能
部分クラス
部分クラスを使用すると、クラスの実装を複数のファイルに分散することができ、各ファイルには 1 つ以上のクラス メンバーが含まれます。これは主に、クラスの一部が自動的に生成される場合に便利です。たとえば、この機能はVisual Studioでコードを生成するユーザー インターフェイス デザイナーによって頻繁に使用されます。
ファイル1.cs:
public partial class MyClass { public void MyMethod1 () { // 手動で記述されたコード} }
ファイル2.cs:
public partial class MyClass { public void MyMethod2 () { // 自動生成されたコード} }
ジェネリック
ジェネリック、またはパラメータ化された型、またはパラメトリックポリモーフィズムは、C# および Visual Basic でサポートされている .NET 2.0 の機能です。C++ テンプレートとは異なり、.NET のパラメータ化された型は、コンパイラではなく実行時にインスタンス化されます。そのため、C++ テンプレートでは言語間互換性がありませんが、.NET のパラメータ化された型は言語間互換性があります。インターフェイスの使用によるジェネリックパラメータの型制約など、C++ テンプレートでは直接サポートされていない機能もサポートしています。一方、C# は非型ジェネリックパラメータをサポートしていません。Java のジェネリックとは異なり、.NET のジェネリックは具象化を使用してパラメータ化された型をCLI仮想マシンのファーストクラスオブジェクトにし、型情報の最適化と保持を可能にします。[1]
静的クラス
静的クラスは、インスタンス化や継承ができず、静的メンバーのみを許可するクラスです。その目的は、多くの手続き型言語の モジュールの目的と似ています。
ジェネレータ機能
.NET 2.0 Frameworkでは、Pythonの に似た構造を使用して、ジェネレーター機能を提供する反復子をC#に導入できました。[2]を使用すると、関数は反復中に自動的に状態を維持します。
yield returnyieldyield return
// 反復可能な入力(配列の場合もある)を受け取り、すべての偶数を返すメソッド。public
static IEnumerable < int > GetEven ( IEnumerable < int > numbers ) { foreach ( int i in numbers ) { if ( i % 2 == 0 ) yield return i ; } }
yield breakまた、イテレータの呼び出し元に無条件に制御が返されるステートメントもあります。yield break各ジェネレータ メソッドの最後には暗黙の があります。
匿名の代表者
C# 3.0 で導入されたラムダ関数の前身として、C# 2.0 では匿名デリゲートが追加されました。これにより、C# にクロージャのような機能が提供されます。 [3]out匿名デリゲートの本体内のコードは、デリゲートのスコープ内のローカル変数、メソッドパラメータ、クラスメンバー(パラメータを除く)に完全な読み取り/書き込みアクセス権を持ちますref。例:
int SumOfArrayElements ( int [] array ) { int sum = 0 ; Array . ForEach ( array , delegate ( int x ) { sum += x ; } ); return sum ; }
一部のクロージャ実装とは異なり、各匿名デリゲートインスタンスは、作成時の実際の値ではなく、バインドされた変数ごとに同じ相対メモリ位置にアクセスできます。この違いの詳細については、こちらを参照してください。
委任共変性と委任反変性
メソッドグループからデリゲート型への変換は、戻り値とパラメータの型においてそれぞれ共変と反変である。 [4]
プロパティアクセサのアクセシビリティは独立して設定できる
例:
文字列ステータス=文字列。空;
public string Status { get { return status ; } // 誰でもこのプロパティの値を取得できます。protected set { status = value ; } // ただし、派生クラスのみが値を変更できます。 }
NULL値型
任意の値型に許可される値のセットにint? i = null;追加する、null 許容値型(疑問符で示されます。例: )。これにより、C# プリミティブ型に対応する型の null 許容列を持つことができる SQL データベースとのやり取りが改善されます。SQL列型は C# に直接変換されます。
nullINTEGER NULLint?
2005 年 8 月末、公式リリースの直前に、Null 許容値型はボックス化特性を改善するために改良されました。つまり、null が割り当てられた Null 許容変数は実際には Null 参照ではなく、struct Nullable<T>プロパティが にHasValue等しい のインスタンスですfalse。ボックス化されると、Nullableインスタンス自体がボックス化され、インスタンスに格納されている値はボックス化されないため、結果の参照は Null 値の場合でも常に非 Null になります。次のコードは、修正された欠陥を示しています。
int? i = null ; object o = i ; if ( o == null ) System . Console . WriteLine ( "正しい動作 - 2005 年 9 月以降のランタイム バージョン" ); else System . Console . WriteLine ( "誤った動作 - プレリリース ランタイム (2005 年 9 月以前)" );
オブジェクトにコピーされると、公式リリースではNullableインスタンスから値がボックス化されるため、null値とnull参照は同等とみなされます。この修正が遅れたため、 .NET2だけでなく、すべての依存テクノロジ( C#、VB、SQL Server 2005、Visual Studio 2005を含む)に影響を与えるコアCLRの変更
が必要になったため、論争が起こりました[5]。
ヌル合体演算子
この演算子はnull合体演算子??と呼ばれ、null許容値型と参照型のデフォルト値を定義するために使用されます。nullでない場合は左側のオペランドを返し、そうでない場合は右側のオペランドを返します。[6]
object nullObj = null ; object obj = new Object (); return nullObj ?? obj ; // obj を返します
この演算子の主な用途は、簡単な構文を使用して、null 可能型を null 不可能型に割り当てることです。
int? i = null ; int j = i ?? 0 ; // i が null でない場合、j を i に初期化します。そうでない場合 (i が null の場合)、j を 0 に初期化します。
参考文献
- ^ 「C# ジェネリックの概要」。Microsoft。2005年1 月。2009 年6 月 18 日閲覧。
- ^ "yield". C# 言語リファレンス. Microsoft . 2009-04-26取得。
- ^ 「匿名メソッド (C#)」。C# プログラミング ガイド。Microsoft。2009年6 月 18日閲覧。
- ^ 「デリゲートの共変性と反変性 (C#)」。C# プログラミング ガイド。Microsoft。2009年6 月 18日閲覧。
- ^ Somasegar (2005 年 8 月 11 日) 。「Nulls not missing anymore」。Somasegarの WebLog。MSDN。2008年11 月 5 日閲覧。
- ^ 「?? 演算子」。C # リファレンス。Microsoft。2008年 11 月 23日閲覧。
