为什么在第一次调用class方法之前没有调用静态构造函数

根据Jon Skeet的artice C#和beforefieldinit和在When中的讨论是一个在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(1,2);

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