2009-02-17 185 views
24

Const被烘焙到客戶端代碼中。 Readonly不是。但const更快。可能只是稍微。什麼時候應該使用const?

的問題是,是否有過,你應該更喜歡const超過readonly任何情況下?或者換句話說,我們實際上不是總是更好使用readonly而不是const(記住上述烘烤的東西)?

回答

28

我認爲唯一的一次「常量」是適當的時候有,你對編碼的一個規範是不是你寫的程序更耐用。例如,如果你正在實現HTTP協議,那麼擁有一個「GET」的const成員是合適的,因爲它永遠不會改變,並且客戶端當然可以將它硬編碼到他們編譯的應用程序中,而不用擔心你需要更改值稍後。

如果您有任何需要更改未來版本中的值的機會,請不要使用const。

哦!除非您已經測量過,否則永遠不要假設const比只讀字段更快。有JIT優化可能會使其實際上完全相同。

+1

「如果您有任何需要更改未來版本中的值的機會,請不要使用const。」我沒有遵循你的邏輯。常數的一部分就是你可以在將來的版本中改變它。 – Powerlord 2009-02-17 19:02:57

+14

如果一個常量比「內部」更公共(或者如果它只是內部的但你有InternalsVisibleTo),那麼允許IL編譯器將常量值複製到引用程序集中。這意味着,如果您發佈新版本並更改常數,那麼您現在與消費者不同步。 – 2009-02-17 21:26:07

+1

@AndrewArnott謝謝你最後一點澄清,我敢說這是一個相當重要的一點! – AgentKnopf 2013-05-14 10:50:09

0

只要您可以在聲明中設置值並且不必等待構造函數,就應該使用const。

3

當初始化不是直截了當時,只讀是很有用的。
在編譯之前確定該值時,可以使用const。

在某種程度上,只讀是一個運行時常量& const爲一個編譯時間恆定值。

編輯:如果您在使用www.koders.com看一些代碼,你會發現有一個使用只讀的地方可能已經使用常量。我認爲,背後的原因可能是它在構造函數中可以修改(如果需要的話)。如果是const(特別是公共),你有機會根據你的代碼破壞客戶端代碼。

4

可以在switch語句fwiw中使用const值作爲一個例子。

2

常量不能用於類或結構(除了字符串常量和空,如碟先生所指出),只爲值類型和作爲靜態字段被訪問。 const的值在編譯時設置,並且在聲明時必須設置。

readonly可以用於枚舉以外的任何內容,可以是靜態或實例字段。 readonly的值在運行時設置,可以根據調用的構造函數進行不同的設置。

Here's a good page爲常量的概述,只讀和靜態關鍵字。

15

Const vs readonly

快速大綱上的差異 '常量',並在C# '只讀' 之間: '常量':

  • 不能是靜態的。
  • 評估值爲編譯時間。
  • 僅在聲明時啓動。

'只讀':

  • 既可以是實例級或靜態的。
  • 評估值爲運行時間。
  • 可以在聲明中或通過構造函數中的代碼進行初始化。

校正:上述狀態常量不能是靜態的。這是一個誤用。他們不能應用static關鍵字,因爲它們已經是靜態的。

所以你使用const來編譯時想要評估的靜態項目。

0

const的一個很好的用法是用於鍵/值對的鍵。例如,如果您仍在使用AppSetting(而不是ApplicationSettings),那麼加載對於配置設置的密鑰名稱沒有意義。如果它在多個地方使用,請將Key放在常量中。

1

您應該更喜歡在編譯時測試過的修飾符,這些修飾符是在運行時測試的(在此上下文中const爲readonly)。你應該總是使用支持你需要的語義的修飾符。 如果有些東西不是要修改的 - 保護它或者有人會寫一些東西(無意或無知)。

3

我通常只使用const來處理我知道的事情永遠不會變化如凍結的溫度。

我更喜歡只讀的東西,可能潛在更改。這樣我只需要在發生更改時重新編譯一個dll。這種經驗法則的一個例外是,如果變量對於其自己的組件是私有的/保護的/友好的。在這些情況下,使用const是安全的。

相關問題