【问题标题】:C#: Is this field assignment safe?C#:这个字段分配安全吗?
【发布时间】:2010-11-20 05:53:22
【问题描述】:

在这个sn-p中:

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

    ...

}

是否有以ConstantB == "Else" 结尾的风险?或者分配是线性发生的?

【问题讨论】:

  • @Svish,请参阅 Jon Skeet 对他的回答的评论
  • @Nathan,谢谢,没有注意到这一点:p

标签: c# constants field variable-assignment


【解决方案1】:

这种字符串连接发生在编译时,因为只有字符串文字(在编译器构造文献中搜索常量折叠)。

别担心。

【讨论】:

    【解决方案2】:

    它应该总是评估为“SomethingElse”

    【讨论】:

      【解决方案3】:

      你总会得到“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 节明确提到了这一点: 只要依赖关系不是循环性质的,就允许常量依赖于同一程序中的其他常量。编译器会自动安排以适当的顺序评估常量声明。


      【讨论】:

      • 是的,你是对的 - 哦! :) 试图在规范中找到保证这一点的位......
      • 编辑了我的答案,至少它不会误导人们,但如果/当我可以的话,会删除它。
      • 这很好。我很确定 Java 的编译器不会做任何此类事情,而且它仅基于排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2010-10-29
      相关资源
      最近更新 更多