2015-05-30 219 views
1

我試圖在單個類中收集我應用程序中的所有字符串聲明,以便它們很容易修改項目範圍。我可以創建一個Strings類,像這樣:具有靜態屬性的靜態類

public static class Strings 
{ 
    public static readonly string Title = "App Title"; 
} 

或像這樣:

public static class Strings 
{ 
    public const string Title = "App Title"; 
} 

類應該是靜態的和所有屬性不變。 Strings的屬性是否有static readonlyconst關鍵字在它們之間有什麼區別?

+1

'const' *隱含*'static',但該語言不允許您同時使用這兩個關鍵字。 –

+1

也許最大的區別是'const'會編譯,而'static const'則不會。你的意思是「靜態只讀」嗎? – dasblinkenlight

+0

「集中所有字符串」是什麼意思? – ilans

回答

2

您可以通過一個簡單的例子,看看差別:

void Main() 
{ 
    var f = F.Foo; 
    var b = F.Bar; 
} 

public class F 
{ 
    public const string Foo = "F"; 
    public static readonly string Bar = "B"; 
} 

將產生以下IL:

IL_0001: ldstr  "F" 
IL_0006: stloc.0  // f 
IL_0007: ldsfld  UserQuery+F.Bar 
IL_000C: stloc.1  // b 
IL_000D: ret 

Fooconst值「出爐」在編譯的號召網站,這就是爲什麼你看到一個值爲「F」的ldstr本身,而static字段發出一個ldsfld,它在運行時加載該字段,然後將其分配給本地變量b

製作字段staticconst是編譯時錯誤。 conststatic都是在類型上定義的,而不是實例。更重要的是,可以在運行時設置static字段,而編譯時必須知道const

如果你想設置一堆不會在運行時改變的常量值,那麼使用const應該沒問題。但是你必須記住,如果你改變const的值,編譯持有const的源代碼是不夠的,你必須重新編譯任何使用const的人。