我不習慣使用Var隱式類型變量。任何人都可以讓我知道使用這種變量的好處嗎?任何隱含使用類型的優點var
回答
一件事是,它是long類型手短......如:
List<Dictionary<string, object>> myList = getList();
可以簡化爲:
var myList = getList();
只需交換現有代碼與var,它可以回來,咬你。考慮一下:var list = new List
或者相反:IList
Annonymous類型:
var person = new { Name = "John", Surname = "Doe" };
在正常使用情況下,'var'完全是可選的,等同於手動指定類型。請參閱here。
但是,'var'關鍵字是anonymous types所必需的,我通常將它與LINQ結合使用。
我特別覺得更容易閱讀本:
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
)。
更好的代碼可讀性。
var anArray = new String[3];
var iStream = new InputStream(...);
var dict = new Dictionary<string, int>();
即使對於應該初始化爲空值的變量,您也可以使用var關鍵字,如下所示:var dict = default(Dictionary
可讀性的思想取決於。在你上面的例子中,這是真的。這更可讀。但是,在您調用返回接口或類型不明確的函數的情況下,可能很難知道 - 未審查相關方法 - 您處理的是哪種類型,因此,我認爲這不太可讀。不是沒有理由不使用var,但我不使用它,因爲它可以單獨讀取...... – 2014-05-20 15:53:58
我相信這是對匿名類型的目的而創建(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
可以返回一個完全不同的對象,上面的代碼仍然可以編譯。 (但要小心 - 現有的編譯程序集不能使用相同的技巧!)
請注意,使用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
}
這只是因爲在泛型之前的.net 2世界存在,而不是var關鍵字的限制。很高興看到MS重新訪問所有這些集合,併爲它們添加一個IEnumerable接口。 – 2010-11-18 02:57:34
除了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!
與庫/其他項目時,這是非常方便的界面合同/方法簽名可以改變。
是的,您仍然需要重新編譯這些類,但是您不必返回並更改所有引用舊返回類型的代碼。
如果外部庫更改了它們的簽名,您仍然需要重新編譯所有庫,因爲在編譯時var將被轉換爲具體類型,而後者將不再匹配。我仍然同意,在沒有任何代碼變化的情況下進行簡單的重新編譯是很好的,但只是爲了清楚起見,因爲可以通過閱讀最後一行來得到var在運行時級別上的作用。 – 2010-11-18 03:00:08
是的 - @BurningIce,優點。是的,你需要重新編譯 - 我所做的一點是你不需要回去修改所有的代碼。 – RPM1984 2010-11-18 03:06:30
- 1. Haskell的類型類隱含
- 2. 「傳遞任何內容時隱含任何?在任何類型的變量?類型參數
- 3. 不一致隱含有'任何'類型的錯誤
- 4. 變量a隱含有 '任何[]' 型
- 5. VAR類型的大LIMIT的缺點
- 6. 類型交點任何
- 7. LabelledGenerid.Aux隱含不使用函數體中的泛型類型時
- 8. Jinja2:如何識別任何循環之前的var類型
- 9. Scalaz`F [_]:Applicative`類型約束是如何隱含使用隱式參數的?
- 10. scala類型類隱含歧義
- 11. 使用一個隱含類型種姓是否改變變量的類型?
- 12. 打字稿 - 參數「U」隱含有一個「任意」類型
- 13. Angular2 - 參數$事件隱含有 '任意' 類型
- 14. 如何使用VAR任何功能
- 15. 使用類型註解函數文字的隱含參數
- 16. 隱含類型變量的javascript問題
- 17. 「VAR」 類型推斷
- 18. 如何使用任意類型的scala.util.Sorting.quickSort()?
- 19. 隱含通用列表<T>的數據類型是否可以隱含?
- 20. 如何找到toString()方法的用法隱含特定類型
- 21. 任何總是使用後綴'f'在C++中使用浮點數的優點?
- 22. C#var var有一個強類型?
- 23. (SAS)期權隱含波動率計算使用proc模型或任何程序
- 24. 使用var = {}()的含義的swift語法?
- 25. C#:ArgumentException的 - XYZ.DLL不包含任何用戶控件類型
- 26. 函數類型在swift中作爲參數類型的優點?
- 27. 使用LIKE優化sql查詢%var%
- 28. 使用Int類型與整體約束。優點?
- 29. 有關使用EO模型優化查詢的任何建議?
- 30. 元素隱含有'任何'類型,因爲類型'計算機'沒有索引簽名
雖然從技術上講,你問了一個不同類型的問題,請看[任何](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
我想知道是否可以通過將標題中的偏見換成「任何優勢來明確拼出類型?」來獲得不同的答案。 :-) – 2010-11-19 00:35:39
[在C#中使用var關鍵字]的可能重複(http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal 2014-07-15 14:31:00