2009-01-09 68 views
29

我目前正在使用ReSharper的30天試用版,到目前爲止,我對它的建議印象深刻。然而,一個建議讓我感到困惑。C#'var'關鍵字與明確定義的變量

當我明確地定義一個變量,如:

List<String> lstString = new List<String>(); 

ReSharped增添了些許彎彎曲曲的綠線,並告訴我:

使用隱式類型的本地變量聲明。

如果我然後按照其建議,ReSharper的改變的代碼行:

var lstString = new List<String>(); 

那麼,有沒有某種性能增益從改變List<String>var了,或者是這僅僅是ReSharper的一個特點?我總是被教導明確定義一個變量,而不是使用動態變量,這是更優化的。

+0

變種是比動態關鍵字不同, 也編譯器將VAR關鍵字轉換爲實際類型手柄 – erdogany 2009-01-09 19:53:08

回答

60

那麼,有沒有某種形式的性能增益要更改列表到VAR

不,但這不是重構的唯一有效原因。更重要的是,它消除了冗餘,並使代碼縮短而不會造成任何損失。

我總是被教導明確定義一個變量,而不是使用動態變量,這是更優化的。

您誤解了var的含義。這是不是以任何方式動態,因爲它產生相同的輸出。這只是意味着編譯器會自行計算變量的類型。它顯然有能力這樣做,因爲這是用於測試類型安全性和正確性的相同機制。

它也消除了完全無用的代碼重複。對於簡單的類型,這可能不會太多。但考慮:

SomeNamespace.AndSomeVeryLongTypeName foo = new SomeNamespace.AndSomeVeryLongTypeName(); 

顯然,在這種情況下,加倍名稱不僅是不必要的,但實際上是有害的。

12

沒有。他們發出完全相同的IL

這只是一個風格問題。

var具有使您更輕鬆地更改函數的返回類型而無需更改源代碼的其他部分的好處。例如,將退貨類型從IEnumerable<T>更改爲List<T>。但是,它可能會更容易引入錯誤。

+6

其實,這是一個貧窮的使用變種。只有在類型從上下文中不言而喻的情況下才能使用它。如果你可以改變方法的返回類型而不改變它的名字,那麼你不應該使用var,因爲涉及的類型不明顯。 – 2009-01-09 20:28:09

+0

@Stephen:當表達式的類型不是很明顯時,爲什麼它很糟糕? – 2009-01-09 21:14:54

+3

將var用作模糊符號會嚴重降低可讀性和可理解性。在閱讀代碼時快速掌握對象的類型導致了更快,更高的理解。 – 2009-01-09 21:59:00

8

關鍵字var實際上並未聲明具有動態類型的變量。該變量仍然是靜態類型的,它只是從上下文中推斷出類型。

它是一個很好的快捷方式,當你有很長的類型名稱(通用typenames可長)​​

1

少打字=更高的生產率:)