2010-11-18 45 views
3

我不習慣使用Var隱式類型變量。任何人都可以讓我知道使用這種變量的好處嗎?任何隱含使用類型的優點var

+0

雖然從技術上講,你問了一個不同類型的問題,請看[任何](http://stackoverflow.com/search?q= [C%23] + var)的其他問題和答案關鍵字'var'。你的問題可能會被認爲是[this]的一個重複項目(http://stackoverflow.com/questions/1430831/anyone-found-a-use-of-var-other-than-for-linq)。 – 2010-11-18 02:23:54

+1

我想知道是否可以通過將標題中的偏見換成「任何優勢來明確拼出類型?」來獲得不同的答案。 :-) – 2010-11-19 00:35:39

+0

[在C#中使用var關鍵字]的可能重複(http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal 2014-07-15 14:31:00

回答

3

一件事是,它是long類型手短......如:

List<Dictionary<string, object>> myList = getList(); 

可以簡化爲:

var myList = getList(); 
+1

只需交換現有代碼與var,它可以回來,咬你。考慮一下:var list = new List (); list.Reverse(); ---然後--- IList list = new List (); list.Reverse();這兩個示例都編譯得很好,但只有第一個示例實際上會顛倒列表的內容。在第二個示例中,編譯器將在IEnumerable上使用Reverse()擴展方法,它的不可變性意味着它返回一個反轉列表,而第一個示例修改列表。 – 2010-11-18 03:09:38

+1

或者相反:IList list = new List (); list.Reverse()FirstOrDefault(); ---然後--- var list = new List (); list.Reverse()FirstOrDefault();在第二個例子中,編譯器會失敗,因爲var會推斷具體的類List,它已經有一個Reverse()方法,而它將在第一個例子中使用擴展方法。所以var也可能有點棘手。 – 2010-11-18 03:21:14

5

Annonymous類型:

var person = new { Name = "John", Surname = "Doe" }; 
2

在正常使用情況下,'var'完全是可選的,等同於手動指定類型。請參閱here

但是,'var'關鍵字是anonymous types所必需的,我通常將它與LINQ結合使用。

1

我特別覺得更容易閱讀本:

foreach(var dbitem in context.usp_GetUserAndAccountData()) 
{ 
    txtUserName.Text = dbitem.UserName; 
    // ... 
} 

比這

foreach(ISingleResult<usp_GetUserAndAccountDataResult> dbitem in context.usp_GetUserAndAccountData()) 
{ 
    txtUserName.Text = dbitem.UserName; 
    // ... 
} 

對於我來說,不管是什麼我明確定義dbitem,我還是會做同樣的動作;所以var這裏是無價的!
它的美妙之處在於,智能感知仍然會在另一端列出所有預期類型的​​成員(例如我的示例中的UserName)。

1

更好的代碼可讀性。

var anArray = new String[3]; 
var iStream = new InputStream(...); 
var dict = new Dictionary<string, int>(); 
+0

即使對於應該初始化爲空值的變量,您也可以使用var關鍵字,如下所示:var dict = default(Dictionary ); – 2010-11-18 03:14:02

+0

可讀性的思想取決於。在你上面的例子中,這是真的。這更可讀。但是,在您調用返回接口或類型不明確的函數的情況下,可能很難知道 - 未審查相關方法 - 您處理的是哪種類型,因此,我認爲這不太可讀。不是沒有理由不使用var,但我不使用它,因爲它可以單獨讀取...... – 2014-05-20 15:53:58

0

我相信這是對匿名類型的目的而創建(ALA Kugels爲例):特別是構造函數和長型名稱中使用

var person = new { Name = "John", Surname = "Doe" }; 

然而,因爲我發現它,我不得不承認我發現它在每天的日常使用較長的類型名稱打交道時非常有用,例如:

var aaa = new Dictionary<string, List<ReallyLongTypeName>>(); 
// vs 
Dictionary<string, List<ReallyLongTypeName>> aaa = new Dictionary<string, List<ReallyLongTypeName>>(); 

另一個副作用是,類型名稱可以改變(或與其他T爲取代YPES),但使用var不會」斷裂,例如代碼:

var item = this.GetItem(); 
this.Name = item.Name; 
this.Age = item.Age; 

只要從的GetItem返回值總是有一個屬性Name和屬性Age(其與this屬性兼容),則GetItems可以返回一個完全不同的對象,上面的代碼仍然可以編譯。 (但要小心 - 現有的編譯程序集不能使用相同的技巧!)

1

請注意,使用var並不總是它看起來(雖然主要是)。一個例子是這樣的:

DataList控件是一個WebForm

foreach (var item in dataList.Items) 
{ 
    // item is of type System.Object 
} 

foreach (DataListItem item in dataList.Items) 
{ 
    // item is of type DataListItem 
} 
+0

這只是因爲在泛型之前的.net 2世界存在,而不是var關鍵字的限制。很高興看到MS重新訪問所有這些集合,併爲它們添加一個IEnumerable接口。 – 2010-11-18 02:57:34

0
從其他的答案

除了DataList控件,給我一個真正優勢與外部代碼打交道時,去耦變量類型實際的方法簽名。

考慮這個接口:

public interface IFoo 
{ 
    List<Foo> GetSomething(); 
} 

,說你有兩行代碼:

List<Foo> foos = fooRepo.GetSomething(); 
var foos2 = fooRepo.GetSomething(); 

上面兩行相同的結果。 (返回List<Foo>)。

現在,如果改變了接口:

public interface IFoo 
{ 
    Dictionary<bool,Foo> GetSomething(); 
} 

第一行現在會拋出一個編譯器錯誤,第二不會:

List<Foo> foos = fooRepo.GetSomething(); // error - can't convert from Dictionary<bool,Foo> to List<Foo> 
var foos2 = fooRepo.GetSomething(); // works! 

與庫/其他項目時,這是非常方便的界面合同/方法簽名可以改變。

是的,您仍然需要重新編譯這些類,但是您不必返回並更改所有引用舊返回類型的代碼。

+0

如果外部庫更改了它們的簽名,您仍然需要重新編譯所有庫,因爲在編譯時var將被轉換爲具體類型,而後者將不再匹配。我仍然同意,在沒有任何代碼變化的情況下進行簡單的重新編譯是很好的,但只是爲了清楚起見,因爲可以通過閱讀最後一行來得到var在運行時級別上的作用。 – 2010-11-18 03:00:08

+0

是的 - @BurningIce,優點。是的,你需要重新編譯 - 我所做的一點是你不需要回去修改所有的代碼。 – RPM1984 2010-11-18 03:06:30

相關問題