亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C#中使用var關鍵字

在C#中使用var關鍵字

九州編程 2019-05-30 12:42:34
在C#中使用var關鍵字在與同事討論了在C#3中使用‘var’關鍵字之后,我想知道人們對通過var進行類型推斷的適當使用有什么看法?例如,我在有問題的情況下懶洋洋地使用var,例如:-foreach(var item in someList) { // ... } // Type of 'item' not clear.var something = someObject.SomeProperty;  // Type of 'something' not clear.var something = someMethod(); // Type of 'something' not clear.更合理地使用var的方法如下:var l = new List<string>(); // Obvious what l will be.var s = new SomeClass(); // Obvious what s will be.有趣的是,LINQ似乎有點灰色,例如:-var results = from r in dataContext.SomeTable               select r; // Not *entirely clear* what results will be here.很清楚結果是什么,因為它將是一種實現IEnDigable的類型,但是在聲明新對象的var的方式上,這并不是完全顯而易見的。更糟糕的是,當涉及LINQto對象時,例如:-var results = from item in someList              where item != 3               select item;這并不比等量的preach(在某些列表中的var項){/.)等價物。這里有一個關于類型安全性的真正關注-例如,如果我們將該查詢的結果放置到一個重載的方法中,該方法接受IEnDigable<int>和IEnDigable<Double>,調用者可能會無意中傳遞錯誤的類型。var 是嗎?保持強類型,但問題是類型在定義上不立即顯現是否危險,當重載意味著當您無意地將錯誤類型傳遞給方法時,這種情況會被放大。
查看完整描述

4 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

我還是覺得var在某些情況下可以使代碼更易讀。如果我有一個帶有Orders屬性的Customer類,并且我想將它賦值給一個變量,我只需要這樣做:

var orders = cust.Orders;

我不在乎顧客。訂單是IEnumerable<Order>ObservableCollection<Order>BindingList<Order>-我只想把這個列表保存在記憶中,然后迭代它,或者得到它的計數或其他東西。

將上述聲明與下列聲明進行對比:

ObservableCollection<Order> orders = cust.Orders;

對我來說,這個類型的名字就是噪音。如果我回去決定改變客戶的類型。ObservableCollection<Order>IList<Order>)然后我也需要修改聲明-如果我一開始就使用var,我就不用修改聲明了。


查看完整回答
反對 回復 2019-05-30
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

我用var廣泛地。有人批評說,這會降低代碼的可讀性,但沒有理由支持這種說法。

誠然,這可能意味著不清楚我們正在處理的是哪種類型的問題。那又怎么樣?這實際上是解耦設計的要點。在處理接口時,您強調的是對變量的類型感興趣。var更進一步,沒錯,但我認為從可讀性的角度來看,這個論點是一樣的:程序員實際上不應該對變量的類型感興趣,而應該對變量的類型感興趣。是嗎?。這就是為什么微軟也稱類型推斷為“鴨子輸入”。

所以,當我使用var?很簡單,不管IntelliSense告訴我什么都行。任何忽略IDE的關于C#的推理都不符合現實。實際上,每個C#代碼都是在支持IntelliSense的IDE中編寫的。

如果我使用的是var聲明變量并混淆變量的存在,我的代碼有一些根本問題。var不是病因,它只會使癥狀明顯。別怪信使。

現在,C#團隊發布了一份編碼指南,聲明var用于捕獲創建匿名類型的LINQ語句的結果(因為在這里,除了var)。去他的吧。只要C#團隊沒有給我一個合理的理由來支持這個準則,我就會忽略它,因為在我的職業和個人看來,這純粹是胡說八道。(對不起,我沒有相關指南的鏈接。)

實際上,有一些(表面上)好解釋為什么你不應該用var但我仍然認為他們在很大程度上是錯誤的。以“searchabililty”為例:作者聲稱var很難找到MyType被利用了。右(邊),正確的。接口也是如此。實際上,我為什么要知道這個類是在哪里使用的呢?我可能更感興趣的是它在哪里被實例化,這仍然是可搜索的,因為在某個地方必須調用它的構造函數(即使這是間接的,類型名稱也必須在某個地方被提及)。


查看完整回答
反對 回復 2019-05-30
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

在我看來,在C#中好東西TM。任何這樣類型的變量仍然是強類型的,但是它從定義它的賦值的右邊獲得它的類型。因為類型信息在右邊是可用的,所以在大多數情況下,也必須在左側輸入類型信息是不必要的,而且過于冗長。我認為這大大提高了可讀性而不降低類型安全性。

在我看來,從可讀性角度看,對變量和方法使用良好的命名約定比顯式類型信息更重要。如果我需要類型信息,我總是可以懸停在變量(在VS中)并得到它。但是,通常情況下,對于讀者來說,顯式類型信息不應該是必需的。對于開發人員來說,無論變量是如何聲明的,在VS中仍然可以獲得IntelliSense。盡管如此,在某些情況下,顯式聲明類型仍然是有意義的-也許您有一個返回List<T>,但你想把它當作IEnumerable<T>用你的方法。為了確保您使用的是接口,聲明接口類型的變量可以使其顯式化。或者,你可能想聲明一個沒有初始值的變量-因為它會立即得到一個基于某種條件的值。在這種情況下,你需要類型。如果類型信息有用或必要,請繼續使用它。不過,我覺得這通常是不必要的,而且在大多數情況下,沒有它的代碼更容易閱讀。


查看完整回答
反對 回復 2019-05-30
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

這兩種說法都不是絕對正確的;var對可讀性有積極和消極的影響。照我的想法,var當下列任何一項為真時,應使用:

  1. 這種類型是匿名的(嗯,你在這里別無選擇,因為它

    在這種情況下是可變的)
  2. 根據指定的表達式(即

    var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating())

var沒有任何性能影響,因為它的語法糖;編譯器推斷和定義類型,一旦它被編譯成IL;沒有什么其實關于它的動態。


查看完整回答
反對 回復 2019-05-30
  • 4 回答
  • 0 關注
  • 600 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號