仍然与BeforeFieldInit混淆

本文关键字:混淆 BeforeFieldInit | 更新日期: 2023-09-27 18:19:27

根据MSDN:

BeforeFieldInit指定调用类型的静态方法不会强制系统初始化类型。

除此之外(IMHO),静态ctor的存在将禁用BeforeFieldInit

现在,如果在类没有静态ctor的情况下调用静态方法,我想检查类型是否未初始化,如下所示。

using System;
namespace Static
{
    class Foo
    {
        public Foo(string arg)
        {
            Console.WriteLine("Foo's ctor called by {0}.", arg);
        }
    }
    class Goo
    {
        Foo f2 = new Foo("Goo's instance field.");
        //static Goo() 
        //{
        //    Console.WriteLine("Goo's static ctor."); 
        //}
        static Foo f = new Foo("Goo's static field.");
        public Goo() 
        { 
            Console.WriteLine("Goo's default ctor.");
        }
        public static void Display()
        {
            Console.WriteLine("Goo's static method.");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Goo.Display();
            Console.ReadKey();
        }
    }
}

输出如下,

Foo's ctor called by Goo's static field..
Goo's static method.

问题

为什么当我调用静态方法时,静态字段仍然被初始化?这似乎和MSDN上面说的不一致。

仍然与BeforeFieldInit混淆

  1. Goo有一个静态构造函数(由编译器创建)
  2. 在CLI规范中:如果标记为BeforeFieldInit,则类型的初始值设定项方法为在首次访问任何静态字段时或之前执行为该类型定义