C#:这个字段分配安全吗?

时间:2009-08-17 13:02:39

标签: c# constants field variable-assignment

在此片段中:

class ClassWithConstants
{
    private const string ConstantA = "Something";
    private const string ConstantB = ConstantA + "Else";

    ...

}

是否存在以ConstantB == "Else"结束的风险?或者这些分配是否线性发生?

3 个答案:

答案 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”