仍然与BeforeFieldInit混淆

时间:2014-08-25 08:05:17

标签: c#

根据MSDN:

  

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

除此之外(恕我直言),静态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上面说的不一致。

1 个答案:

答案 0 :(得分:0)

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