在此片段中:
class ClassWithConstants
{
private const string ConstantA = "Something";
private const string ConstantB = ConstantA + "Else";
...
}
是否存在以ConstantB == "Else"
结束的风险?或者这些分配是否线性发生?
答案 0 :(得分:37)
你总会得到“SomethingElse”。这是因为ConstantB依赖于ConstantA。
你甚至可以切换线条,你会得到相同的结果。编译器知道ConstantB依赖于ConstantA并将相应地处理它,即使你在部分类中编写它。
要完全确定您可以运行VS命令提示符并调用ILDASM。在那里你可以看到实际的编译代码。
此外,如果您尝试执行以下操作,则会出现编译错误:
private const string ConstantB = ConstantA + "Else";
private const string ConstantA = "Something" + ConstantB;
错误:评估“ConsoleApplication2.Program.ConstantB”的常量值涉及循环定义 这种证明编译器知道它的依赖性。
补充:Jon Skeet指出的规范参考:
这在C#3规范的10.4节中明确提到: 只要依赖关系不是循环性的,就允许常量依赖于同一程序中的其他常量。编译器会自动安排以适当的顺序评估常量声明。
答案 1 :(得分:3)
这个字符串连接发生在编译时,因为只有字符串文字(在编译器构造文献中搜索常量折叠)。
不要担心。
答案 2 :(得分:2)
应始终评估为“SomethingElse”