2011-11-26 61 views
0

可能重複:
Use of var keyword in C#隱式類型變種

相對較新的C#我想知道的動機MS已經向大家介紹了var隱含類型變量。該文件說:

一個隱式類型的局部變量是強類型的,就好像你 了自己聲明的類型,但是編譯器確定的類型。

某些行進一步:

在許多情況下使用VAR是可選的,僅僅是一個語法 方便

這一切都不錯,但在我看來,這隻會造成混亂。

假設您正在檢查此循環。

foreach (var item in custQuery){ 
    // A bench of code... 
} 

而是審查的內容和循環的語義,我會失去寶貴的時間尋找項目的類型! 我寧願以下代替:

foreach (String item in custQuery){ 
    // A bench of code... 
} 

的問題是:我讀了隱式類型變量幫助LINQ打交道時,是否真正幫助在其他情況下使用呢?

+4

如果您在Visual Studio中工作,您可以將光標放在var關鍵字上,它會告訴您實際的類型。 – BoltClock

+0

也許這可以幫助你:http://stackoverflow.com/questions/650919/using-implicitly-typed-local-variables – NotGaeL

回答

5

引入LINQ時需要var關鍵字,以便該語言可以爲匿名類型創建強類型變量。

例子:

var x = new { Y = 42 }; 

現在x是具有特定類型的強類型的變量,但該類型沒有名字。編譯器知道什麼x.Y手段,所以你不必使用反射來獲取數據的對象,你想,如果你這樣做:

object x = new { Y = 42 }; 

現在x是類型object的,這樣你就可以不要用x.Y

當與LINQ用它可以例如是這樣的:

var x = from item in source select new { X = item.X, Y = item.Y }; 

x變量現在是一個IEnumerable<T>其中T是不具有名稱的特定類型。

由於var關鍵字被引入,它也被用來使代碼更具可讀性,並被濫用來保存擊鍵。

其中它使代碼更可讀的將是一個例子:的

var list = 
    new System.Collections.Generic.List<System.Windows.Forms.Message.Msg>(); 

代替:

System.Collections.Generic.List<System.Windows.Forms.Message.Msg> list = 
    new System.Collections.Generic.List<System.Windows.Forms.Message.Msg>(); 

這是一個很好用的var關鍵字,作爲類型在已經存在聲明。在此,關鍵字可以被濫用的例子就是像聲明:

var result = SomeMethod(); 

由於SomeMethod名不給什麼類型的返回,這不是明顯的變量的類型會是怎樣的任何指示。在這種情況下,您應該寫出類型而不是使用var關鍵字。真正需要

+0

我認爲OP意識到它是匿名類型所必需的,並且正在詢問它與命名類型的用法。 – BoltClock

+0

@BoltClock:好點,我在LINQ之外添加了一些用例。 – Guffa

+0

對於命名類型,'var'是一個壞主意,它只是保存了輸入。它被添加是因爲匿名類型需要它。 –

2

我覺得有些動機是爲了讓這樣的事情 -

List<int> list = new List<int>(); 

要變成這個 -

var list = new List<int>(); 

第二個例子是短,更具可讀性,但仍明確表示代碼的意圖。有些情況下它不太清楚,但是在很多情況下,你會得到簡潔而不會失去清晰度。

+1

如果因爲任何原因右手邊必須有一個完全合格的名字,這變得更加有效。 – BoltClock

+1

我不會購買更容易打字的理由來使用它。 keyboardig是(好的,應該是)開發軟件的核心競爭力,並節省一些擊鍵(尤其是智能感知)並不是那麼有吸引力。容易閱讀是應該在這裏提出的論點。擺脫重複是促進可讀性,這是重要的。可打字性不是重要的一點。 –

+0

+1我同意,輸入這麼多感謝VS並不容易,輸入有多棒,但它確實減少了可能的錯別字,這很好。但最終它使它更具可讀性! – aevanko

1

VAR匿名類型,這是Linq中使用的位:

var results = 
    from item in context.Table 
    select new {Name=item.Name, id=item.id}; 

因爲收藏是一個匿名類型的,它不能被命名。它一個真正的類型,但沒有一個在編譯前有一個名字。