C# 3.0 の機能

# 暗黙的に型指定された変数 (var)

var キーワードを使用すると、プログラマはコンパイル時に変数を暗黙的に型指定できます。 var 宣言は、明示的に宣言された変数と同じ型です。

var squaredNumber = 10 * 10;
var squaredNumberDouble = 10.0 * 10.0;
var builder = new StringBuilder();
var anonymousObject = new
{ 
    One = SquaredNumber,
    Two = SquaredNumberDouble,
    Three = Builder
}

上記の変数の型は int です 、 doubleStringBuilder 、それぞれ匿名型です。

var であることに注意することが重要です。 variable は動的に型付けされません。 SquaredNumber = Builder int を設定しようとしているため、無効です StringBuilder のインスタンスに

# 統合言語クエリ (LINQ)

//Example 1
int[] array = { 1, 5, 2, 10, 7 };

// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
                         where x % 2 == 1
                         orderby x descending
                         select x * x;
// Result: 49, 25, 1

C# 3.0 に関するウィキペディアの記事の例、LINQ サブセクション

例 1 では、SQL クエリに似たように設計されたクエリ構文を使用しています。

//Example 2
IEnumerable<int> query = array.Where(x => x % 2 == 1)
    .OrderByDescending(x => x)
    .Select(x => x * x);
// Result: 49, 25, 1 using 'array' as defined in previous example

C# 3.0 に関するウィキペディアの記事の例、LINQ サブセクション

例 2 では、メソッド構文を使用して、例 1 と同じ結果を達成しています。

C# では、LINQ クエリ構文は LINQ メソッド構文のシンタックス シュガーであることに注意することが重要です。コンパイラは、コンパイル時にクエリをメソッド呼び出しに変換します。一部のクエリは、メソッド構文で表現する必要があります。 MSDN より - 「たとえば、指定した条件に一致する要素の数を取得するクエリを表現するには、メソッド呼び出しを使用する必要があります。」

# ラムダ式

ラムダ式は、暗黙的に型指定されたパラメーターと戻り値を可能にする匿名メソッドの拡張です。それらの構文は匿名メソッドよりも冗長ではなく、関数型プログラミング スタイルに従います。

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        var numberList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        var sumOfSquares = numberList.Select( number => number * number )
            .Aggregate( (int first, int second) => { return first + second; } );
        Console.WriteLine( sumOfSquares );
    }
}

上記のコードは、1 から 10 までの数字の二乗和をコンソールに出力します。

最初のラムダ式は、リスト内の数値を 2 乗します。パラメータは 1 つしかないため、括弧は省略できます。必要に応じて括弧を含めることができます:

.Select( (number) => number * number);

または明示的にパラメータを入力しますが、括弧が必要です:

.Select( (int number) => number * number);

ラムダ本体は式であり、暗黙の戻り値があります。必要に応じて、ステートメント本体も使用できます。これは、より複雑なラムダに役立ちます。

.Select( number => { return number * number; } );

select メソッドは、計算された値を含む新しい IEnumerable を返します。

2 番目のラムダ式は、select メソッドから返されたリスト内の数値を合計します。複数のパラメーターがあるため、括弧が必要です。パラメータの型は明示的に型指定されていますが、これは必須ではありません。以下のメソッドは同等です。

.Aggregate( (first, second) => { return first + second; } );

これもそうです:

.Aggregate( (int first, int second) => first + second );

# 匿名型

匿名型は、最初に型を明示的に定義しなくても、一連の読み取り専用プロパティを 1 つのオブジェクトにカプセル化する便利な方法を提供します。型名はコンパイラによって生成され、ソース コード レベルでは使用できません。各プロパティの型は、コンパイラによって推測されます。

new を使用して匿名型を作成できます 中括弧が続くキーワード ({ ) .中括弧内では、以下のコードのようにプロパティを定義できます。

var v = new { Amount = 108, Message = "Hello" };

匿名型の配列を作成することもできます。以下のコードを参照してください:

var a = new[] { 
    new { 
        Fruit = "Apple", 
        Color = "Red" 
    },
    new {
        Fruit = "Banana",
        Color = "Yellow"
    }
};

または、LINQ クエリで使用します:

var productQuery = from prod in products
                   select new { prod.Color, prod.Price };

# コメント

C# バージョン 3.0 は、.Net バージョン 3.5 の一部としてリリースされました。このバージョンで追加された機能の多くは、LINQ (統合言語クエリ) をサポートしていました。

追加された機能のリスト:

  • LINQ
  • ラムダ式
  • 拡張方法
  • 匿名型
  • 暗黙的に型指定された変数
  • オブジェクトとコレクションの初期化子
  • 自動的に実装されるプロパティ
  • 式ツリー