根据Jon Skeet的artice C# and beforefieldinit和When is a static constructor called in 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 Debugger调试上面的代码。当在Main方法中执行语句StaticClass.Equals(1,2);
时,不会调用静态构造函数,但是当执行StaticClass.foo();
时,它会调用静态构造函数,然后调用foo方法。
我很困惑,为什么在执行StaticClass.Equals(1,2);
时没有第一次调用它。
答案 0 :(得分:12)
您StaticClass.Equals
的来电实际只是致电Object.Equals(Object, Object)
,因为StaticClass
并未为Equals
提供适用的重载}。如果您查看IL,您将看到编译器已解决了对Object.Equals(1, 2)
的调用。如果您没有调用实际涉及静态类的方法,则不需要初始化。