2011-03-17 138 views
4

我有這樣的事情:爲什麼我不能在c#中訪問公共常量?

namespace MyNamespace {  

    public partial class MyClass: UserControl { 

     public static const String MYCONST = "MyConstant"; 

我看不到MYCONST從任何地方甚至從MyClass的,爲什麼呢?

+2

你有編譯錯誤嗎?它說什麼 ? – driis 2011-03-17 21:12:25

+0

你是如何訪問它的? – 2011-03-17 21:12:47

+3

嘗試刪除「靜態」或「常量」關鍵字中的任意一個。 – Mikhail 2011-03-17 21:13:54

回答

11

無論如何,一個常量在靜態上下文中可用,所以刪除static關鍵字,你會沒事的。

MSDN文檔:

static修飾符不恆定的聲明允許。

的原因是一個恆定的值必須在編譯時完全計算,什麼編譯器是,它需要的是價值和整個常數值的代碼替換所有不變的慣例。

這就是爲什麼它有時可以更好地使用公共只讀值而不是編譯器而不是用值替換用法,而是鏈接到只讀變量。當從另一個程序集使用常量時,這是特別需要考慮的事項,因爲您可能不會一次更新所有程序集,而最終可能會使用舊的常量值進行程序集。

編號:http://msdn.microsoft.com/en-us/library/e6w8fe1b(v=vs.80).aspx

3

應該可以訪問如MyNamespace.MyClass.MYCONST

6

根據文檔const

static聲明中不允許使用static修飾符。

從常量中刪除靜態關鍵字,它應該工作。

編輯
注意,一個const將作爲一個類的成員,當你有staticconst變量只是喜歡。但對於conststatic是隱含的,不允許輸出。

+1

你不能是靜態的和不變的。就像隱形和粉紅色一樣。 – madmik3 2011-03-17 21:17:54

+0

嘗試只讀,但這意味着它在靜態構造函數中被暴露。 *聳肩* – 2011-03-17 21:19:09

5

你使用的是哪種類型的編譯器?

通常,公開常量不是一個好主意。它們的行爲不同於只讀變量,它們的字面值被編譯到IL中。如果在另一個程序集中聲明const,這是一個問題。例如,您可以爲修改常量值的程序集提供錯誤修復程序。然而,產品中的其他裝配將繼續使用舊值。抖動不會抱怨不匹配。不好。

公共常量只有在'manifest'常量時纔是可以的。像Math.PI一樣,只有在另一個Universe中運行代碼纔會產生意外的結果。產品或公司名稱已相當危險。

+0

我絕對同意。如果它將是'public','protected'或'protected internal',則它應該是'readonly'。只有「私人」或「內部」值或僅限於單一方法的值應該是「const」。 – 2011-03-17 22:23:43

相關問題