プログラミング言語C#バージョン 3.0 は、 .NET Framework 3.5の一部として 2007 年 11 月 19 日にリリースされました。HaskellやMLなどの関数型プログラミング言語からヒントを得た新機能が含まれており、主に共通言語ランタイムへの統合言語クエリ(LINQ) パターンの導入によって推進されています。 [1]現在、どの標準化団体でも標準化されていません。
C# 3.0 の機能
LINQ (言語統合クエリ)
LINQ は、プレーン オブジェクト コレクション、XML ドキュメント、データベースなど、さまざまな種類のデータ ソースに対応する、Microsoft 固有の新しい拡張可能な汎用クエリ言語であり、他の C# 言語機能と緊密に統合されています。構文は SQL とは異なりますが、SQLから借用しています。例:
int []配列= { 1 , 5 , 2 , 10 , 7 };
// 降順でソートされた配列内のすべての奇数の平方を選択します
IEnumerable < int > query = from x in array where x % 2 == 1 orderby x descending select x * x ; // 結果: 49, 25, 1
LINQ を実装するために、クラスを介して多くのコレクションに幅広い新しいメソッドが追加されましたSystem.Linq.Enumerable。LINQ 式は、コンパイル前にこれらの関数を使用するように変換されます。代わりに、より強力または直接的な方法として、これらの関数に直接アクセスすることもできます。[2] そうすることで、以下で説明するラムダ関数をより多く使用できるようになります。次の例は、機能的には上記の例と同じです。
IEnumerable < int > query = array . Where ( x => x % 2 == 1 ) . OrderByDescending ( x => x ) . Select ( x => x * x ); // 結果: 49, 25, 1 (前の例で定義した 'array' を使用)
オブジェクト初期化子
Customer c = new Customer (); c .Name = "John " ;
書くことができる
顧客c =新しい顧客{名前= "John" };
コレクション初期化子
MyList list = new MyList ( ) ; list.Add ( 1 ) ; list.Add ( 2 ) ;
次のように書くことができる
MyListリスト=新しいMyList { 1 , 2 };
MyListを実装しSystem.Collections.IEnumerable、publicメソッドを持っていると仮定するAdd。[3]
ローカル変数の型推論
ローカル変数の型推論:
var x =新しい辞書<文字列,リスト<浮動小数点>> ();
は以下と互換性がある
辞書<文字列、リスト<浮動小数点>> x =新しい辞書<文字列、リスト<浮動小数点>> ();
この機能は、ローカル変数宣言を短くするための便利な構文糖であるだけでなく、匿名型の変数の宣言にも必要です。ただし、コンテキスト キーワード「var」は、ローカル変数宣言内でのみ使用できます。
匿名型
匿名型は、最初に型を明示的に定義しなくても、一連の読み取り専用プロパティを 1 つのオブジェクトにカプセル化する便利な方法を提供します。型名はコンパイラによって生成され、ソース コード レベルでは使用できません。プロパティの型はコンパイラによって推論されます。
var x = new { FirstName = "John" 、LastName = "Doe" };
匿名型は、オブジェクトから直接派生する参照型です。アプリケーションはアクセスできませんが、コンパイラによって名前が付けられます。共通言語ランタイムの観点から見ると、匿名型は、オブジェクト以外の型にキャストできないことを除いて、他の参照型と何ら変わりありません。
2つ以上の匿名型が同じ数と型のプロパティを同じ順序で持つ場合、コンパイラはそれらを同じ型として扱い、コンパイラによって生成された同じ型情報を共有します。[4]
ラムダ式
ラムダ式は、第一級の匿名関数値を記述する簡潔な方法を提供します。次の C# 2.0 スニペットを比較してください。
listOfFoo . Where ( delegate ( Foo x ) { return x . Size > 10 ; });
C# 3.0 では次のようになります:
listOfFoo . Where ( x => x . Size > 10 );
上記の例では、ラムダ式は、パラメータと戻り値の型の型推論を伴う匿名デリゲートの省略構文にすぎません。ただし、使用されるコンテキストによっては、C# コンパイラーはラムダをASTに変換して実行時に処理することもできます。上記の例では、がlistOfFoo単純なメモリ内コレクションではなく、データベース テーブルのラッパーである場合、この手法を使用してラムダの本体を同等の SQL 式に変換し、実行を最適化できます。いずれにしても、ラムダ式自体はコード内でまったく同じに見えるため、実行時の使用方法はクライアントに対して透過的です。
表現ツリー
x <= y、、a = b + cまたはラムダ関数やその他の複雑な形式などの式は、式ツリーを使用して動的に作成できます。機能の多くは、クラス の静的メソッドによって提供されますSystem.Linq.Expressions.Expression。その名前空間には、それらのメソッドによって作成された式と部分式をソフトウェアオブジェクトとして表すさまざまな新しいクラスもあります。これらにはBinaryExpression、 を表すことができるx <= y、LambdaExpressionなどが含まれます。リフレクションAPI の側面と組み合わせると、これは非常に強力なツールになりますが、作成とデバッグが少し難しい場合があります。[5] [6]
自動プロパティ
コンパイラは、次のようなコードを指定すると、プライベート インスタンス変数と適切なアクセサーおよびミューテーターを生成します。
パブリック文字列Name { get ; private set ; }
拡張メソッド
開発者は、拡張メソッドを使用して、既存の CLR 型のパブリック コントラクトに新しいメソッドを追加できます。その場合、サブクラス化したり、元の型を再コンパイルしたりする必要はありません。実際には、拡張メソッドは、既存のクラスの定義外で新しいメソッドを追加しているように見せる構文糖の一種です。この錯覚は、インスタンス メソッドのように呼び出し可能な静的メソッドの定義によって実現されます。この静的メソッドでは、呼び出しの受信者 (つまり、インスタンス) が、キーワード で修飾されたメソッドの最初のパラメーターにバインドされますthis。
拡張メソッドの要件は次のとおりです。
- 拡張メソッドは静的クラスで定義する必要があります。
- 拡張メソッドは静的メソッドとして定義する必要があります。
- 拡張メソッドの最初のパラメータは次の形式を取る必要があります。ここで、typeは拡張する型の名前です。
this type parameterName - 拡張メソッドでは、オプションでパラメータに続く他のパラメータを定義できます
this。
このサンプル クラスは、文字列の拡張メソッドの定義と使用方法を示していますLeft。
public static class StringExtensions { public static string Left ( this string s , int n ) { return s . Substring ( 0 , n ); } } string s = "foo bar" ; s . Left ( 3 ); // StringExtensions.Left(s, 3) と同じで、"foo" を返します。
部分メソッド
部分メソッドを使用すると、コードジェネレーターは、部分クラスの別の部分で実際に実装された場合にのみコンパイルに含まれる拡張ポイントとしてメソッド宣言を生成できます。[7]
参考文献
- ^ Anderson, Tim (2006-11-14). 「C# が Java を凌駕 - 主任アーキテクトが C# の見通しをバラ色に描く」Reg Developer . The Register . 2007-01-20閲覧。
- ^ Walther, Stephen (2008). ASP.NET 3.5 Unleashed . インディアナ州、米国: SAMS. pp. 916–917. ISBN 978-0-672-33011-7
クエリ構文はメソッド構文のサブセットであるため、クエリ構文よりもメソッド構文を使用することが多いようです
。 - ^ Torgersen, Mads (2006-10-10). 「コレクションとは何か?」The Mellow Musings of Dr. T. 2009-06-18閲覧。
- ^ 「匿名型」。C # プログラミング ガイド。Microsoft。2008年 7 月。2009 年 6 月 18 日に閲覧。
- ^ Walther, Stephen (2008). ASP.NET 3.5 Unleashed . インディアナ州、米国: SAMS . pp. 950–952. ISBN 978-0-672-33011-7。
- ^ 「式ツリー」。.NET Framework 開発者ガイド。Microsoft。2009年 4 月 26日閲覧。
- ^ 「部分クラスと部分メソッド」。C # プログラミング ガイド。Microsoft。2009年 4 月 28日閲覧。
外部リンク
- C# 3.0 の概要 (Microsoft MSDN)
