2015-05-30 190 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的人。