2013-10-30 30 views
15

我正在開發一個新項目,我注意到一些我不確定的代碼是否屬實。我用來證明這個問題的名稱和值是假的。字符串常量類應該是靜態的嗎?

public class MyConsts //Should it be static? 
{ 
    public const string MyConst1 = "a"; 
    public const string MyConst2 = "b"; 
    public const string MyConst3 = "c"; 
    public const string MyConst4 = "d"; 
    .... 
} 

對於我的邏輯這個類(僅包含consts值)應該是靜態的,所以沒辦法對其進行初始化,它有沒有意義的,對嗎?

編輯:我正在編寫代碼盲,所以我混淆了字符串和const的順序 - 因爲它不是我的問題的目標,我已經解決了這個問題。

+1

該類不應該存在。您想要改用資源。 –

+3

@JoelCoehoorn我已經看到很多情況下,這種確切的方法是合適的,資源最多不會帶來任何好處。即'HtmlTags.Div =「div」'作爲常量的集合是完全正確的,但如果放入資源中,則需要額外注意避免本地化。 –

+2

@JoelCoehoorn - 不,他應該有一個由'ConstantsFactory'繼承的'IAbstractFactory',它從資源中讀取常量,然後使用IOC容器注入它們。 – Davor

回答

32

是的,它是有意義的,它是靜態的。這表示您意向,防止客戶端甚至宣稱類型的變量等

你需要之前移動const修改雖然一部分:

public const string MyConst1 = "a"; 
... 

如果值可能會改變,但考慮使用public static readonly字段而不是const,否則該值將被烘焙到引用常量的任何代碼中,這意味着如果值發生更改,則需要重新生成任何客戶端代碼。

(另一種選擇是使常量internal代替public

+1

謝謝。靜態變化對內存或性能有什麼影響嗎? (因爲我知道靜態類在應用程序的開始處編譯,而不是在調用時)編譯 –

+2

@MishaZaslavsky:不,你知道靜態類的區別是不真實的,據我所知。 –

+0

靜態類在編譯其他所有內容時編譯,它們在第一次訪問時被初始化_initialized_。 – Brad

2

是的,它應該是靜若處值永遠不會改變。正如你所說,讓客戶端代碼實例化它是沒有意義的。

1

如果它只包含const並且不包含任何其他內容,那麼您最好將其設置爲靜態類以防止實例化以及堵塞。

5

是的班級應該是static。但相關,如果這些值實際上是const

任何聲明爲const的東西都會被編譯到任何引用程序集中,所以如果這是一個類庫,並且你發佈了一個新的版本並對這些常量值進行了更改,那麼它們將不會被引用它們。

在該特定情況下,public static readonly string是有意義的。但是,如果這些僅在單個特定程序集(例如控制檯應用程序或WinForms應用程序)中可見,那麼您應該聲明internalconst這樣的類很好。

0

真的,這取決於你。 Static對於純粹的實用類來說非常有用。

請記住,靜態類是密封的;它不能被繼承。

相關問題