2012-10-31 26 views
73

我想聲明PI常數是這樣的:常量不能標記靜態

public static const double PI = Math.PI; 

,但爲什麼我收到此錯誤?

The constant 'Calendar.NewCalendar.PI' cannot be marked static 
+1

可能的重複http://stackoverflow.com/questions/408192/why-cant-i-have-public-static-const-string-s-stuff-in-my-class – himanshupareek66

回答

156

const意味着static(您不需要實例來引用const值)。

我想補充一點:當你用public const鏈接(引用)程序集時,該值爲複製到你的程序集中。因此,如果引用程序集中的const值發生更改,則程序集仍將具有最初編譯的值。

如果此行爲是而不是可以接受,那麼您應該考慮將該字段設置爲public static readonly字段。

Lib.dll,作爲二進制提供:

public class Foo { 
    public const int HATS = 42; 
    public static readonly int GLOVES = 33; 
} 

APP.EXE,引用Lib.dll:

Foo.HATS // This will always be 42 even if the value in Lib.dll changes, 
      // unless App.exe is recompiled. 

Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll 

MSDN

不要創建常數來表示您希望隨時更改的信息。例如,不要使用常量字段來存儲服務的價格,產品版本號或公司的品牌名稱。這些值可能會隨着時間而改變,並且由於編譯器會傳播常量,因此您的庫中編譯的其他代碼將不得不重新編譯以查看更改。

DotNetPerls

的DLL。當您使用const字段或聲明時,C#編譯器實際上將const變量的值直接嵌入到IL代碼中。因此,它基本上將const作爲一個單獨的實體進行擦除。

注意: 如果依賴於const程序const值發生變化後不重新編譯,它們可能會破壞[,因爲他們將繼續使用以前的值]。

9

你不能有靜態常量。嘗試只讀而不是const,或者簡單地刪除「靜態」,因爲「const」隱含靜態。

10

根據定義,常量是靜態的。

+0

這是適用於'最終'在java中也是 –

+0

@ BasheerAL-MOMANI:沒有。在構造函數調用後,final是不可改變的。而已。 –

+0

aha然後'最終'就像'只讀',,,,我對嗎? –

4

常量在編譯期間不能在代碼中被替換,而不是在運行時被替換,因此不需要靜態或實例定義。

2

所有常量聲明都是隱式靜態的,C#規範聲明禁止使用靜態修飾符(冗餘)包含。我相信這是爲了避免如果讀者看到兩個常量,一個聲明爲靜態而另一個不是 - 他們可以輕易地認爲規範中的差異意味着語義上的差異可能會發生混淆。話雖如此,沒有禁止冗餘地指定一個訪問修飾符,這也是默認的訪問修飾符,如果有選擇的話。例如,(具體)方法可以明確標記爲私有,儘管這是默認的。該規則似乎是在沒有選擇的情況下(例如,接口中的方法聲明)禁止使用冗餘修飾符。哪裏有選擇,這是允許的。