共用方式為


隱含型別區域變數 (C# 程式設計手冊)

更新: 2008 年 7 月

可以給予區域變數推斷「型別」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 關鍵字不代表 “variant”,也不代表變數是不嚴格規定型別或晚期繫結的。只代表編譯器會判斷並指派最適當的型別。

var 關鍵字可在下列內容中使用:

  • 在區域變數上 (方法範圍中宣告的變數),如前述範例所示。

  • for 初始化陳述式中。

    for(var x = 1; x < 10; x++)
    
  • foreach 初始化陳述式中。

    foreach(var item in list){...}
    
  • using 陳述式

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

如需詳細資訊,請參閱 HOW TO:在查詢運算式中使用隱含型別區域變數和陣列 (C# 程式設計手冊)

var 和匿名型別

在許多情況下,使用 var 是選擇性的,並且只為了在語法上便於使用。不過,當變數以匿名型別初始化時,如果您稍後需要存取物件的屬性,則必須宣告該變數為 var。這是 LINQ 查詢運算式中的常見狀況。如需詳細資訊,請參閱匿名型別 (C# 程式設計手冊)

從原始程式碼的角度來看,匿名型別沒有名稱。因此,如果已使用 var 初始化查詢變數,則可以存取傳回的物件序列中屬性的唯一方法,就是使用 var 做為 foreach 陳述式中反覆運算變數的型別。

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。

請參閱

工作

HOW TO:在查詢運算式中使用隱含型別區域變數和陣列 (C# 程式設計手冊)

概念

LINQ 查詢運算式 (C# 程式設計手冊)

參考

隱含型別陣列 (C# 程式設計手冊)

匿名型別 (C# 程式設計手冊)

物件和集合初始設定式 (C# 程式設計手冊)

var (C# 參考)

for (C# 參考)

foreach, in (C# 參考)

using 陳述式 (C# 參考)

其他資源

C# 參考

Language-Integrated Query (LINQ)

變更記錄

日期

記錄

原因

2008 年 7 月

修正陳述式,達到初始化匿名型別時需要 var 的效果。事實上,只有在您稍後還需要存取那些物件的屬性時,才需要這個變數。

內容 Bug 修正。