2010-10-04 50 views
1

哪一個更好或可能更快地聲明一個變量?哪一個更好? 「var」或「DataType」?

var ds = new Class1(); 

OR

Class1 ds = new Class1(); 

我個人認爲,第二個應該是更快的堂妹編譯器並不需要尋找的類型Class1,但像ReSharper一些加載項總是通知我改變Class1var
任何人都可以解釋我爲什麼?

+1

注意,這不是特定於4.0。 – jball 2010-10-04 19:40:10

+0

是的是的...對不起......它來自.Net3.5 – 2010-10-04 19:41:06

+9

我們不是已經超過了這一百萬次嗎? – 2010-10-04 19:46:02

回答

9

它們編譯爲相同的IL,所以都不會更快。但是,可讀性可能有很大差異。

傾向於有利於明確聲明變量的類型,但使用var如有下列情況適用:

  • 我調用構造函數和類型名稱很長(特別是與仿製藥)
  • 我使用匿名類型
  • 類型名稱是合理長和初始化表達式是漫長的,但還是很明確作爲什麼類型將返回
  • 我想強調的代碼,而不是它如何來實現這個結果的目的

與可讀性的許多問題,還有的在哪裏使用var意見種類繁多 - 從「無處」到「無處不在」。請注意,您可以在選項中更改ReSharper爲您推薦的內容。(我似乎記得默認情況下它「推薦」兩種方式 - 所以真的只是讓你更容易切換。)

有幾個答案提到了涉及的擊鍵次數。我認爲這是最差可能的原因有利於var。我很少,如果有的話,打字速度瓶頸。我的編碼速度更依賴於我對問題領域的理解,以及我能夠想象解決方案的清晰程度。我寧願輸入2000個按鍵,但最終得到一個優雅的設計,其實際上是用100個字符表示,而不是僅輸入500個按鍵,用於難以讀取的500個字符的設計。想想花費在上的時間,而不是打字的機制,而是讀取的代碼。

+0

對於LINQ表達式,我幾乎全部使用'var'。爲什麼我需要弄清楚表達式的類型是什麼,以及讀者爲什麼要關心? – Gabe 2010-10-04 20:47:03

+0

@加貝:大部分時間,我完全同意。只是每隔一段時間,實際上都很重要......但這絕對是例外而非規則。 – 2010-10-04 21:02:44

5

它們都編譯爲相同的東西。當使用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。其中最值得注意的是處理方法的返回值。如果從方法的名稱不清楚返回值的類型是什麼,我會明確地定義它。這樣可以減少混亂,以防萬一發生任何變化。

+0

那麼,爲什麼'var'被推薦? – 2010-10-04 19:39:25

+3

@Dr TJ:如果您稍後更改定義,則鍵入的次數會減少,並且出現錯誤的機會也會減少。 – 2010-10-04 19:43:51

+0

+10用於'稍後更改定義'。 – BrunoLM 2010-10-04 19:47:33

4

這只是編譯時的類型推斷,所以沒有性能成本。 「性能增益」是,它寫得更快var :)

1

去任何更可讀。在您的示例中,我認爲第一個示例更具可讀性,重複性更低。如果你沒有在同一行上的類名(因爲你正在將變量初始化爲方法調用的結果),那麼我會使用類型名聲明樣式來明確誰在讀代碼。

2

作爲一項規則我贊成靠在var當它是沒有必要的(它與匿名類型)和類型名稱並不可怕複雜(Dictionary<int, List<Class.InnerClass<HashSet<SomeOtherClass>>>或此類)。

每當我聽到這個建議時,查看ReSharper會在我的待辦事項列表中稍微滑動一下。

2

沒有性能差異 - 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()