我听说过做这样的事情是个坏主意:
public const double Pi = 3;
因为稍后当我意识到我需要将其更改为3.14
时,其他组合将无法在重新编译之前看到更改。因此readonly
将是更好的选择。
这同样适用于字符串吗?例如
public const string Name = "Buh";
它只是不变的参考,对吧?或者编译器是否在这里做了一些聪明的事情?
是字符串文字,“Buh”是否内联到其他程序集中?或者只是引用“Buh”内联?
答案 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相同。