暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)

ローカル変数には、明示的な型ではなく、推論される "型" var を設定できます。 var キーワードは、初期化ステートメントの右側の式から変数の型を推測することをコンパイラに指示します。 推論される型は、組み込み型、匿名型、ユーザー定義型、または .NET Framework クラス ライブラリで定義されている型です。 配列を var で初期化する方法の詳細については、「暗黙的に型指定される配列 (C# プログラミング ガイド)」を参照してください。

var を使用してローカル変数を宣言するさまざまな方法を次の例に示します。

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();

var キーワードは "バリアント型" を意味するものではなく、変数の柔軟な型指定や遅延バインディングを示すものでもない点を理解しておくことが重要です。 このキーワードは、最適な型をコンパイラが決定し割り当てることを意味するだけです。

キーワード var は、次のような状況で使用します。

  • 前の例に示したようなローカル変数 (メソッド スコープで宣言された変数) に対する設定。

  • 初期化ステートメント for 内。

    for(var x = 1; x < 10; x++)
    
  • 初期化ステートメント foreach 内。

    foreach(var item in list){...}
    
  • using ステートメント内。

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

詳細については、「方法 : クエリ式で暗黙的に型指定されるローカル変数および配列を使用する (C# プログラミング ガイド)」を参照してください。

var と匿名型

多くの場合、var の使用は任意で、構文上便利なだけです。 ただし、変数が匿名型で初期化される場合、後でオブジェクトのプロパティにアクセスできるようにするには、その変数を var として宣言する必要があります。 これは、LINQ クエリ式ではよくあることです。 詳細については、「匿名型 (C# プログラミング ガイド)」を参照してください。

ソース コードから見た場合、匿名型には名前がありません。 したがって、クエリ変数を var で初期化した場合、返されたオブジェクトのシーケンスのプロパティにアクセスする唯一の方法は、foreach ステートメント内の反復変数の型として var を使用することです。

class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types, 
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */

解説

暗黙的に型指定された変数の宣言には、次の制約があります。

  • var は、ローカル変数を宣言し、宣言と同じステートメントで初期化する場合にのみ使用できます。この変数を、null 値、メソッド グループ、または匿名関数に初期化することはできません。

  • var をクラス スコープのフィールドで使用することはできません。

  • var を使用して宣言された変数は、初期化式では使用できません。 つまり、式 int i = (i = 20); は有効ですが、var i = (i = 20); はコンパイル時にエラーになります。

  • 複数の暗黙的に型指定された変数を、同じステートメントで初期化することはできません。

  • スコープ内に var という名前の型が存在する場合、var キーワードはその型名に解決され、暗黙に型指定されたローカル変数宣言の一部とは見なされません。

var は、クエリ式と使用する場合にも便利なことがあります。クエリ変数の構築された型を厳密に判別することが難しい場合です。 この状況はグループ化および順序付けの操作で生じることがあります。

var キーワードは、変数の特定の型をキーボードで入力するのが面倒な場合、型が明白な場合、または型によってコードが読みやすくならない場合にも有用です。 このような理由で var が有用な例としては、グループ化操作で使用されるような入れ子にされたジェネリック型があります。 次のクエリでは、クエリ変数の型は IEnumerable<IGrouping<string, Student>> です。 コードの記述者とそのコードを保守する担当者がこのことを理解している限り、簡略にするために暗黙的な型指定を使用しても問題はありません。

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
 var studentQuery3 =
     from student in students
     group student by student.Last;

ただし、var を使用すると、少なくとも他の開発者がコードを理解しづらくなる潜在的な可能性があります。 このため、C# のドキュメントでは通常、必要なときにのみ var を使用しています。

参照

処理手順

方法 : クエリ式で暗黙的に型指定されるローカル変数および配列を使用する (C# プログラミング ガイド)

参照

暗黙的に型指定される配列 (C# プログラミング ガイド)

匿名型 (C# プログラミング ガイド)

オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)

var (C# リファレンス)

for (C# リファレンス)

foreach、in (C# リファレンス)

using ステートメント (C# リファレンス)

概念

LINQ クエリ式 (C# プログラミング ガイド)

その他の技術情報

C# リファレンス

統合言語クエリ (LINQ: Language-Integrated Query)