为什么在第一次调用类方法之前不调用静态构造函数

本文关键字:调用 静态 构造函数 类方法 第一次 为什么 | 更新日期: 2023-09-27 18:12:16

根据Jon Skeet的文章c#和beforefieldinit以及在c#中何时调用静态构造函数中的讨论?静态构造函数必须在第一次调用类的方法之前调用。

由于某些原因,以下代码没有显示此行为:

namespace AbstractAndStatic
{
    class Program
    {
        static void Main(string[] args)
        {
            StaticClass.Equals(1,2);
            StaticClass.foo();
        }
    }
    static class StaticClass : Object
    {
        public static void foo()
        {
            Console.WriteLine("Static");
        }
         static StaticClass()
        {
            Console.WriteLine("static constructor");
        }
    }
    class TestClass
    {
        public void deb()
        {
            Console.WriteLine("Test Class Debug");
        }
    }
}     

我正在使用Visual Studio调试器调试上述代码。当语句StaticClass.Equals(1,2);在Main方法中执行时,静态构造函数没有被调用,但是当StaticClass.foo();执行时,它调用静态构造函数,然后调用foo方法。

我有点困惑,为什么在执行StaticClass.Equals(1,2);时没有第一次调用

为什么在第一次调用类方法之前不调用静态构造函数

StaticClass.Equals的调用实际上只是对Object.Equals(Object, Object)的调用,因为StaticClass没有为Equals提供适用的过载。如果查看IL,您将看到编译器只解析了对Object.Equals(1, 2)的调用。如果你调用的方法实际上不涉及静态类,则不需要初始化。

静态构造函数的执行由以下第一个事件触发:

创建类的实例。 类的任何静态成员都被引用