使用带有字符串的公共const是否安全?

时间:2011-04-07 10:47:52

标签: c# const

我听说过做这样的事情是个坏主意:

public const double Pi = 3;

因为稍后当我意识到我需要将其更改为3.14时,其他组合将无法在重新编译之前看到更改。因此readonly将是更好的选择。

这同样适用于字符串吗?例如

public const string Name = "Buh";

它只是不变的参考,对吧?或者编译器是否在这里做了一些聪明的事情?

是字符串文字,“Buh”是否内联到其他程序集中?或者只是引用“Buh”内联?

3 个答案:

答案 0 :(得分:2)

http://weblogs.asp.net/psteele/archive/2004/01/27/63416.aspx

const是编译时,所以你是对的:如果将来可能会改变,请使用readonly

答案 1 :(得分:2)

问题在于,在生成IL之前,编译器将使用常量的实际值替换所有常量,因此它的类型无关紧要。如果它是一个字符串,double,int或者其他什么,使用const的程序集将继续使用旧值,直到它们被重新编译,因为编译的IL不知道任何常量存在。它只是知道价值本身,就像你直接硬编码一样。

另一方面,

readonly与其他非只读字段一样被评估,因此无论readonly字段的类型如何,其他程序集都会看到更改。

答案 2 :(得分:1)

字符串是不可变的,因此它与double相同。