【发布时间】:2011-03-12 13:50:45
【问题描述】:
在C#中,有什么区别
static readonly string MyStr;
和
const string MyStr;
?
【问题讨论】:
标签: c#
在C#中,有什么区别
static readonly string MyStr;
和
const string MyStr;
?
【问题讨论】:
标签: c#
当您使用const 字符串时,编译器在编译时嵌入字符串的值。
因此,如果您在不同的程序集中使用 const 值,然后更新原始程序集并更改该值,则其他程序集将不会看到更改,直到您重新编译它。 p>
static readonly 字符串是在运行时查找的普通字段。因此,如果在不同的程序集中更改了字段的值,则在加载程序集时将立即看到更改,而无需重新编译。
这也意味着static readonly 字符串可以使用非常量成员,例如Environment.UserName 或DateTime.Now.ToString()。 const 字符串只能使用其他常量或文字进行初始化。
此外,可以在静态构造函数中设置static readonly 字符串; const 字符串只能内联初始化。
注意static string是可以修改的;你应该改用static readonly。
【讨论】:
const 应该只用于常量——常量是从不的值, 永远,永远改变。
private const 来表示严格来说不是常量的值;基本上它滥用const 进行微优化。我会坚持我的“永远,永远,永远” 声明,即使它让我成为伪君子。 ;)
这里是a good breakdown of the pros and cons:
因此,当值不太可能改变时,或者如果没有外部应用程序/库将使用常量时,似乎应该使用常量。当需要运行时计算或外部消费者是一个因素时,应使用静态只读字段。
【讨论】:
constpublic const string MyStr;
是一个编译时间常量(你可以把它作为一个方法参数的默认参数),如果你使用这种技术,它不会被混淆
static readonlypublic static readonly string MyStr;
是运行时常量。这意味着它在应用程序启动时而不是之前进行评估。这就是为什么它不能用作方法的默认参数(例如编译错误)。其中存储的值可以被混淆。
【讨论】:
OQ 询问了 static string 和 const。两者都有不同的用例(尽管两者都被视为静态)。
仅将 const 用于真正恒定的值(例如光速 - 但即使这取决于介质)。这个严格准则的原因是 const 值被替换为引用它的程序集中的 const 的使用,这意味着如果 const 在其定义位置发生变化(即它不应该是一个常量),您可能会遇到版本控制问题毕竟)。请注意,这甚至会影响 private const 字段,因为您可能在不同的程序集和 private fields are inherited 中有基类和子类。
静态字段与它们在其中声明的类型相关联。它们用于表示对于给定类型的所有实例需要相同的值。这些字段可以根据需要多次写入(除非指定为只读)。
如果您的意思是 static readonly 与 const,那么我建议在几乎所有情况下使用 static readonly,因为它更具未来性。
【讨论】: