哪一個更好或可能更快地聲明一個變量?哪一個更好? 「var」或「DataType」?
var ds = new Class1();
OR
Class1 ds = new Class1();
我個人認爲,第二個應該是更快的堂妹編譯器並不需要尋找的類型Class1
,但像ReSharper
一些加載項總是通知我改變Class1
到var
。
任何人都可以解釋我爲什麼?
哪一個更好或可能更快地聲明一個變量?哪一個更好? 「var」或「DataType」?
var ds = new Class1();
OR
Class1 ds = new Class1();
我個人認爲,第二個應該是更快的堂妹編譯器並不需要尋找的類型Class1
,但像ReSharper
一些加載項總是通知我改變Class1
到var
。
任何人都可以解釋我爲什麼?
它們編譯爲相同的IL,所以都不會更快。但是,可讀性可能有很大差異。
我傾向於有利於明確聲明變量的類型,但使用var
如有下列情況適用:
與可讀性的許多問題,還有的在哪裏使用var
意見種類繁多 - 從「無處」到「無處不在」。請注意,您可以在選項中更改ReSharper爲您推薦的內容。(我似乎記得默認情況下它「推薦」兩種方式 - 所以真的只是讓你更容易切換。)
有幾個答案提到了涉及的擊鍵次數。我認爲這是最差可能的原因有利於var
。我很少,如果有的話,打字速度瓶頸。我的編碼速度更依賴於我對問題領域的理解,以及我能夠想象解決方案的清晰程度。我寧願輸入2000個按鍵,但最終得到一個優雅的設計,其實際上是用100個字符表示,而不是僅輸入500個按鍵,用於難以讀取的500個字符的設計。想想花費在上的時間,而不是打字的機制,而是讀取的代碼。
對於LINQ表達式,我幾乎全部使用'var'。爲什麼我需要弄清楚表達式的類型是什麼,以及讀者爲什麼要關心? – Gabe 2010-10-04 20:47:03
@加貝:大部分時間,我完全同意。只是每隔一段時間,實際上都很重要......但這絕對是例外而非規則。 – 2010-10-04 21:02:44
它們都編譯爲相同的東西。當使用var
時,您只需讓編譯器在編譯時推斷該類型即可。這可能會增加一點時間來編譯(我沒有真正測試過這個部分),但在運行時不會有任何影響。
前者的優勢(這是我比較喜歡個人)是當你開始處理long類型名稱:
var conn = new System.Data.SqlConnection(connString);
少了很多按鍵,比更容易閱讀:
System.Data.SqlConnection conn = new System.data.SqlConnection(connString);
此外,沒有var
,使用匿名類型幾乎不可能:
var someObj = new { Name = "Test", Saying = "Hello World!" };
雖然我確實更喜歡使用完整類型名稱而不是var
。其中最值得注意的是處理方法的返回值。如果從方法的名稱不清楚返回值的類型是什麼,我會明確地定義它。這樣可以減少混亂,以防萬一發生任何變化。
那麼,爲什麼'var'被推薦? – 2010-10-04 19:39:25
@Dr TJ:如果您稍後更改定義,則鍵入的次數會減少,並且出現錯誤的機會也會減少。 – 2010-10-04 19:43:51
+10用於'稍後更改定義'。 – BrunoLM 2010-10-04 19:47:33
這只是編譯時的類型推斷,所以沒有性能成本。 「性能增益」是,它寫得更快var
:)
去任何更可讀。在您的示例中,我認爲第一個示例更具可讀性,重複性更低。如果你沒有在同一行上的類名(因爲你正在將變量初始化爲方法調用的結果),那麼我會使用類型名聲明樣式來明確誰在讀代碼。
作爲一項規則我贊成靠在var
當它是沒有必要的(它與匿名類型)和類型名稱並不可怕複雜(Dictionary<int, List<Class.InnerClass<HashSet<SomeOtherClass>>>
或此類)。
每當我聽到這個建議時,查看ReSharper會在我的待辦事項列表中稍微滑動一下。
沒有性能差異 - var的類型是在編譯時確定的。
至於哪一個更好,這是一個偏好問題。就個人而言,如果代碼清楚地標識var的類型,我更喜歡var。例如:
// very much preferred
var o = new System.blah.blah.Class1()
但是,如果你要考慮太多的類型,那麼喜歡的類型DEF:
// I don't like this much because the return type isn't obvious
var result = AMethodThatReturnsSomeKindOfValue()
注意,這不是特定於4.0。 – jball 2010-10-04 19:40:10
是的是的...對不起......它來自.Net3.5 – 2010-10-04 19:41:06
我們不是已經超過了這一百萬次嗎? – 2010-10-04 19:46:02