2011-08-31 281 views
0

我在VS2010中編程c#並測試了一個名爲ReSharper的插件。根據我的經驗,我覺得它可以清理代碼並簡化不必要的邏輯。然而,它在我的代碼中拾取的主要問題之一是當我初始化變量時。C#初始化變量

Resparper建議初始化才子「VAR」

int i = 0 ----> var i = 0 
      or... 
MyClass1 MyClass = new MyClass(1) 

我始終認爲,使用VAR有輕微的開銷,似乎有點懶出來或鬆散型(雖然我不知道它有一定的優勢)。我一直在嘗試查找是否有一個很好的理由來初始化這樣的變量。 Reshaper說,使用var是一個有爭議的問題,但它有很好的用於初始化的擴展。有誰知道這可能會或可能不會?

+1

如果你想了解更多關於var's的內容,請點擊這裏:http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c – rie819

回答

7

顯式變量類型用法vs var只是一個偏好問題。你可以用resharper關閉它。

enter image description here

+0

對於爲什麼它會是某人的任何意見在某人已經明確聲明它們之後,首選將聲明更改爲var? – mbeckish

+0

@mbeckish:ChaosPandion相當好地回答了這個問題。 http://stackoverflow.com/questions/7261390/c-initializing-variables/7261429#7261429 – StriplingWarrior

+1

@StriplingWarrior - 我同意你的答案和ChaosPandion,你正在調用構造函數的情況。我對JBone的第一個例子更加好奇:「int i = 0 ----> var i = 0」。 – mbeckish

3

使用var只是使用隱式類型,而不是明確呼叫類型,與var聲明的變量仍是強類型的,將被編譯成相同的代碼爲顯式類型變量 - 沒有開銷。

唯一不同的情況是,當你想要以不同的方式輸入不同的表達式時,例如當表達式返回一個具體的類時,你希望變量具有接口的類型該界面。在這些情況下,您應該明確聲明變量。

5

如果這是懶惰,那麼我不想生產力。

Dictionary<int, Dictionary<string, string>> map = 
    new Dictionary<int, Dictionary<string, string>>(); 

var map = new Dictionary<int, Dictionary<string, string>>(); 
+1

你必須一次輸入它 - 先輸入它,然後點擊Tab鍵幾次,然後在新的後面填入你的下半部分。無論哪種方式,你只輸入一次。 – tsells

+1

@tsells - 這是真的,但考慮*不要重複自己的原則。 – ChaosPandion

+0

我認爲這不適用於此。特別是在瀏覽器中使用代碼輔助功能。如果您手動輸入它是一回事 - 但是按照預期使用這些工具時 - DRY不適用。 – tsells

2

的一點是,當你將一個變量的new Classname(...)直接使用你絕對清楚且唯一知道最終的變量類型,因爲剛纔打電話的構造。

在這種情況下,var有一個很好的語法,並且使事情變得緊湊,其優點是如果將來您將使用另一種類型的對象更改賦值,則變化很小。

在不完全清楚分配的對象類型的情況下,我仍然希望將其明確化。

但最終幾乎是一個哲學問題:d

3

var已經沒有運行時開銷和相當小的編譯時間開銷。它生成的IL代碼實際上等同於如果使用顯式類型。無論你是否喜歡使用它,完全是一個偏好問題。我個人設置ReSharper的,除非初始化時明顯的類型來打擾我:

Person p = new Person(); // Resharper bugs me 
int i = 0; // Resharper leaves this alone. 
1

var本身並不是一個類型。它只是下令編譯器來查找的類型在初始化的右側,這就是爲什麼以下不會編譯:

var x; // invalid because x is still statically typed 

所以,無論這會對編譯時有不好的影響,也不會有任何運行時間開銷。它基本上是syntactic sugar,生成的「機器」代碼將是相同的。