72.静态字段和构造函数初始化顺序

  1. 72.静态字段和构造函数初始化顺序
    1. 72.1 题目
    2. 72.2 深入解析
    3. 72.3 答题示例
    4. 72.4 关键词联想

72.静态字段和构造函数初始化顺序


72.1 题目

public class Main1
{
     static object value1;

     static Main1()
     {
          value1 = new object();
     }

     static object value2 = new object();
}

value1和value2谁先初始化?


72.2 深入解析

value2 的字段初始化器先执行,随后执行静态构造函数体,为 value1 赋值。静态字段初始化器整体在静态构造函数之前按声明顺序执行(见 C# 规范)。


72.3 答题示例

“在 C# 中,静态字段的显式初始化会在静态构造函数执行前按代码顺序依次运行。
对于给定代码:

static object value1;                       // 默认为 null
static Main1() { value1 = new object(); }  // 静态构造函数体
static object value2 = new object();       // 静态字段显式初始化

执行顺序是:

  1. value1 默认被置为 null
  2. value2 = new object();(按声明顺序,先对 value2 进行初始化);
  3. 然后调用静态构造函数,执行 value1 = new object();

因此,**value2 会先被初始化**,然后才进入静态构造函数体为 value1 赋值。”


72.4 关键词联想

  • 静态字段初始化顺序
  • 静态构造函数(static ctor)
  • 字段显式初始化
  • 默认值赋予
  • 类型初始化时机
  • C# 规范行为


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏