const string vs. static readonly string in c#
在C中,两者之间的区别是什么?
1
| static readonly string MyStr; |
和
当使用const字符串时,编译器在编译时嵌入该字符串的值。因此,如果在其他程序集中使用const值,然后更新原始程序集并更改该值,则在重新编译之前,其他程序集将看不到更改。
static readonly字符串是在运行时查找的正常字段。因此,如果字段的值在不同的程序集中发生更改,则在加载程序集时将立即看到这些更改,而无需重新编译。
这也意味着static readonly字符串可以使用非常量成员,如Environment.UserName或DateTime.Now.ToString()。const字符串只能使用其他常量或文本初始化。另外,可以在静态构造函数中设置static readonly字符串;只能在内联中初始化const字符串。
注意,可以修改static string;您应该改为使用static readonly。
- +1,从实际和语义的角度来看,显而易见的结论是:const只应用于常量——常量是永远不会改变的值。
- @永远,永远,永远,永远都不会有一点坚强。如果将私有字符串声明为const并在两个重新编译事件之间更改它,我不会想到会发生什么糟糕的事情。
- @布伦达:我承认,我确实使用private const来表示那些严格来说不是常量的值;基本上,它滥用const来进行微观优化。我会坚持我的"永远,永远,永远"的声明,即使它使我成为一个伪君子。;)
- 尤其是字符串的性能如何?每次常量使用都会在内存中生成字符串的新副本吗?
下面是一个很好的利弊分析:
So, it appears that constants should be used when it is very unlikely that the value will ever change, or if no external apps/libs will be using the constant. Static readonly fields should be used when run-time calculation is required, or if external consumers are a factor.
- 文章中非常有趣的一点——"在高级别上,常量显然在编译时处理,而静态只读字段则在运行时计算时设置。编译器对常量值进行子编译的事实意味着,如果常量值发生更改,则需要重新编译引用常量值的任何库/程序集。引用静态只读字段的库将引用字段而不是值,因此它们将在不需要重新编译的情况下获取字段中的任何更改。"
- 是的,我也读过,有段时间。我当然不知道。
- 我要找的是静态只读的!
- @旋转链接不工作。
- 这是Google缓存版本:webcache.googleusercontent.com/…
- 引用链接不再可用。
- 这是对标记为解决方案的答案的极好称赞。定义用法非常有用。比我高1。
快速回答:
1
| public const string MyStr; |
是编译时常量(例如,可以将其用作方法参数的默认参数),如果使用这种技术,则不会混淆它。
1
| public static readonly string MyStr; |
是运行时常量,这意味着它是在启动应用程序时计算的,而不是在启动应用程序之前。这就是为什么它不能用作方法(编译错误)的默认参数的原因。存储在其中的值可能被混淆
OQ询问了static string和const的情况。两者都有不同的用例(尽管两者都是静态的)。
仅对真正恒定的值使用const(例如光速-但这取决于介质)。这个严格准则的原因是,const值被替换为引用它的程序集中const的用法,这意味着如果const在其定义位置发生更改(即,它根本不应该是常量),就可能存在版本控制问题。注意,这甚至会影响private const字段,因为您可能在不同的程序集中拥有基和子类,而私有字段是继承的。
静态字段绑定到它们声明的类型。它们用于表示给定类型的所有实例都需要相同的值。这些字段可以写入任意次数(除非指定为只读)。
如果你是说static readonly对const,那么我建议在几乎所有情况下使用static readonly,因为它更能证明未来。
只能在类或变量初始值设定项的static构造函数中更改static readonly string的值,而不能在任何地方更改const字符串的值。