【问题标题】:Initialization Order of Static Fields in Static Class静态类中静态字段的初始化顺序
【发布时间】:2010-12-02 10:59:16
【问题描述】:

给出以下代码:

public static class Helpers
{
   private static Char[] myChars = new Char[] {'a', 'b'};

   private static Int32 myCharsSize = myChars.Length;
}

是否保证myChars 将被初始化之前我使用它的长度分配给myCharsSize

【问题讨论】:

    标签: c# static-initializer


    【解决方案1】:

    是的,他们会的,请参阅C# specification 的第 15.5.6.2 条:

    类的静态字段变量初始化器对应于 以文本顺序执行的任务序列 它们出现在类声明中(§15.5.6.1)。在一个 部分类,“文本顺序”的含义由 §15.5.6.1。如果类中存在静态构造函数(第 15.12 节), 静态字段初始化器的执行发生在紧接之前 执行该静态构造函数。否则,静态字段 初始化器在依赖于实现的时间执行 第一次使用该类的静态字段。

    话虽如此,我认为在静态类型初始化程序(静态构造函数)中进行初始化会更好。

    【讨论】:

    • @Marc - 大声笑,我发布了“是”,所以我会是第一个,然后带着证据回来。既然我不能再成为 FGTW,我想我不应该再担心成为第一了:D
    • 您可以在visualstudio.com/license-terms/…找到当前规范。
    • 部分类呢?
    • @Sinjai 您可以在同一个文档上检查 15.3.1:“在这些情况下,在多个部分中声明的类型中成员的顺序是未定义的。”
    【解决方案2】:

    嗯...我很惊讶编译(确实如此,我检查过)。我不知道有任何保证可以确保安全。使用静态构造函数...


    编辑:我接受(见better answer above)它会起作用;但我对代码的想法是让它尽可能简单和明显。如果它不是明显它会起作用(如果你必须问它不可能),那么不要这样写......

    尤其是依赖字段顺序的问题:

    • 如果您移动代码(我经常这样做),它可能会中断
    • 如果您将代码拆分为 partial 类,它可能会中断

    我的建议仍然是:在这种情况下使用静态构造函数。

    【讨论】:

    • +1 这个建议是合理的——仅仅因为你可以做某事并不意味着你应该这样做。我认为即使语言确实支持这种类型的字段初始化,也可以使用静态构造函数。
    • 尽管您可以使用静态属性/字段初始化程序编写更简洁的代码(每个属性键入一次属性名称而不是两次——一次在定义中,一次在静态初始化函数中)。在某些情况下,这可能是源文件适合一个屏幕或需要滚动才能完整查看之间的差异。取决于你的目标是什么。如果您想以与需要初始化的顺序不同的顺序对属性进行文本布局,那么,是的,手动编写的静态初始化函数是您唯一的选择。
    【解决方案3】:

    乍一看,我不确定,我不得不尝试一下,看看它是否能编译。

    鉴于此,我将在静态构造函数中初始化该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 2017-05-31
      • 1970-01-01
      • 2018-12-19
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多