2010-11-29 119 views

回答

128

這意味着宣佈本地存在的類型將由編譯器推斷:

// This statement: 
var foo = "bar"; 
// Is equivalent to this statement: 
string foo = "bar"; 

值得注意的是,var沒有定義的變量爲動態類型。因此,這是不合法的:

var foo = "bar"; 
foo = 1; // Compiler error, the foo variable holds strings, not ints 

var只有兩個用途:

  1. 它需要較少的打字聲明變量,變量聲明爲嵌套泛型類型時尤其如此。
  2. 必須存儲到一個匿名類型的對象的引用時使用,因爲類型名稱不能提前知道:var foo = new { Bar = "bar" };

不能使用var作爲任何東西,但當地人的類型。因此,您不能使用關鍵字var來聲明字段/屬性/參數/返回類型。

+1

這是一個很好的例子,說明Stack Exchange上需要的答案。有時候人們會忽略重要的信息和/或不夠簡短。 – Panzercrisis 2016-04-12 14:03:37

12

這意味着數據類型是從上下文派生(暗示)的。

http://msdn.microsoft.com/en-us/library/bb383973.aspx

在於在方法範圍中聲明可以 具有隱式類型變種的Visual C#3.0,變量 開始。一個 隱式類型局部變量是 強類型,就好像您自己已經聲明瞭 類型,但 編譯器確定類型。 i的 以下兩個聲明是 功能上等同的:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

var是用於消除鍵盤打字和視覺噪聲,例如有用,

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName(); 

變得

var x = new MyReallyReallyLongClassName(); 

但可以被濫用到可讀性被犧牲的地步。

7

「var」表示編譯器將根據使用情況確定變量的顯式類型。例如,

var myVar = new Connection(); 

會給你一個Connection類型的變量。

3

你有沒有討厭寫這樣的變量初始值設定項?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int)) 

所以,從C#3.0,你可以用

var xmlSerializer = new XmlSerialzer(typeof(int)) 

一個通知更換:編譯時類型得到解決,所以其性能沒有問題。但編譯器應該能夠在構建步驟中檢測類型,所以像var xmlSerializer;這樣的代碼根本不會編譯。

4

它根據在初始化中分配給它的內容來聲明一個類型。

一個簡單的例子是,代碼:

var i = 53; 

將審查53的類型,基本上是重寫此爲:

int i = 53; 

請注意,雖然我們可以有:

long i = 53; 

這不會發生在var。儘管它可以用:

var i = 53l; // i is now a long 

同理:

var i = null; // not allowed as type can't be inferred. 
var j = (string) null; // allowed as the expression (string) null has both type and value. 

這可能是一個小的便利與複雜類型。它與匿名類型更爲重要:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name}; 
foreach(var j in i) 
    Console.WriteLine(j.ID.ToString() + ":" + j.Name); 

在這裏有定義ij比使用var,因爲是他們持有的類型沒有名字,沒有其他辦法。