Const
被烘焙到客戶端代碼中。 Readonly
不是。但const
更快。可能只是稍微。什麼時候應該使用const?
的問題是,是否有過,你應該更喜歡const
超過readonly
任何情況下?或者換句話說,我們實際上不是總是更好使用readonly
而不是const
(記住上述烘烤的東西)?
Const
被烘焙到客戶端代碼中。 Readonly
不是。但const
更快。可能只是稍微。什麼時候應該使用const?
的問題是,是否有過,你應該更喜歡const
超過readonly
任何情況下?或者換句話說,我們實際上不是總是更好使用readonly
而不是const
(記住上述烘烤的東西)?
我認爲唯一的一次「常量」是適當的時候有,你對編碼的一個規範是不是你寫的程序更耐用。例如,如果你正在實現HTTP協議,那麼擁有一個「GET」的const成員是合適的,因爲它永遠不會改變,並且客戶端當然可以將它硬編碼到他們編譯的應用程序中,而不用擔心你需要更改值稍後。
如果您有任何需要更改未來版本中的值的機會,請不要使用const。
哦!除非您已經測量過,否則永遠不要假設const比只讀字段更快。有JIT優化可能會使其實際上完全相同。
只要您可以在聲明中設置值並且不必等待構造函數,就應該使用const。
當初始化不是直截了當時,只讀是很有用的。
在編譯之前確定該值時,可以使用const。
在某種程度上,只讀是一個運行時常量& const爲一個編譯時間恆定值。
編輯:如果您在使用www.koders.com看一些代碼,你會發現有一個使用只讀的地方可能已經使用常量。我認爲,背後的原因可能是它在構造函數中可以修改(如果需要的話)。如果是const(特別是公共),你有機會根據你的代碼破壞客戶端代碼。
可以在switch語句fwiw中使用const值作爲一個例子。
常量不能用於類或結構(除了字符串常量和空,如碟先生所指出),只爲值類型和作爲靜態字段被訪問。 const的值在編譯時設置,並且在聲明時必須設置。
readonly可以用於枚舉以外的任何內容,可以是靜態或實例字段。 readonly的值在運行時設置,可以根據調用的構造函數進行不同的設置。
Here's a good page爲常量的概述,只讀和靜態關鍵字。
快速大綱上的差異 '常量',並在C# '只讀' 之間: '常量':
- 不能是靜態的。
- 評估值爲編譯時間。
- 僅在聲明時啓動。
'只讀':
- 既可以是實例級或靜態的。
- 評估值爲運行時間。
- 可以在聲明中或通過構造函數中的代碼進行初始化。
校正:上述狀態常量不能是靜態的。這是一個誤用。他們不能應用static關鍵字,因爲它們已經是靜態的。
所以你使用const來編譯時想要評估的靜態項目。
const的一個很好的用法是用於鍵/值對的鍵。例如,如果您仍在使用AppSetting(而不是ApplicationSettings),那麼加載對於配置設置的密鑰名稱沒有意義。如果它在多個地方使用,請將Key放在常量中。
您應該更喜歡在編譯時測試過的修飾符,這些修飾符是在運行時測試的(在此上下文中const爲readonly)。你應該總是使用支持你需要的語義的修飾符。 如果有些東西不是要修改的 - 保護它或者有人會寫一些東西(無意或無知)。
我通常只使用const來處理我知道的事情永遠不會變化如凍結的溫度。
我更喜歡只讀的東西,可能潛在更改。這樣我只需要在發生更改時重新編譯一個dll。這種經驗法則的一個例外是,如果變量對於其自己的組件是私有的/保護的/友好的。在這些情況下,使用const是安全的。
「如果您有任何需要更改未來版本中的值的機會,請不要使用const。」我沒有遵循你的邏輯。常數的一部分就是你可以在將來的版本中改變它。 – Powerlord 2009-02-17 19:02:57
如果一個常量比「內部」更公共(或者如果它只是內部的但你有InternalsVisibleTo),那麼允許IL編譯器將常量值複製到引用程序集中。這意味着,如果您發佈新版本並更改常數,那麼您現在與消費者不同步。 – 2009-02-17 21:26:07
@AndrewArnott謝謝你最後一點澄清,我敢說這是一個相當重要的一點! – AgentKnopf 2013-05-14 10:50:09