C# 为什么在第一次调用类方法之前不调用静态构造函数
根据Jon Skeet的文章和讨论,静态构造函数必须在第一次调用类的方法之前被调用 由于某些原因,以下代码不显示此行为:C# 为什么在第一次调用类方法之前不调用静态构造函数,c#,.net,C#,.net,根据Jon Skeet的文章和讨论,静态构造函数必须在第一次调用类的方法之前被调用 由于某些原因,以下代码不显示此行为: namespace AbstractAndStatic { class Program { static void Main(string[] args) { StaticClass.Equals(1,2); StaticClass.foo(); } }
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");
}
}
}
我正在使用VisualStudio调试器调试上述代码。当语句StaticClass.等于(1,2)时代码>在主方法中执行,静态构造函数不会被调用,而是在StaticClass.foo()时执行代码>被执行,它调用静态构造函数,然后调用foo方法
我有点困惑,为什么在执行StaticClass.Equals(1,2)时它没有第一次被调用
您对StaticClass.Equals的调用实际上只是对的调用,因为StaticClass
没有为Equals
提供适用的重载。如果您查看IL,您将看到编译器已经解析了对justObject.Equals(1,2)
的调用。如果您没有调用实际涉及静态类的方法,则不需要对其进行初始化。我认为您需要重写Object.Equals。目前,它正在调用基本版本。顺便说一句,每个类都从object继承,所以不必手动执行。Equals()方法写在哪里?@MicrosoftDN它是从object继承的。Equals
@RonBeyer:不,它调用的是静态Equals(object,object)
方法。@Jonsket在发布该方法之前大约30秒就知道了:)注意“它不需要初始化“-如果框架决定更早调用静态构造函数,它仍然是有效的行为。@AlexeiLevenkov:不,不会。如果一个类型有一个静态构造函数,它保证只在第一次引用该类的成员之前执行。您可能会考虑何时初始化没有静态构造函数的类型,这要宽松得多。具体来说,从C#规范中可以看出:“静态构造函数的执行是由应用程序域中发生的以下第一个事件触发的:创建类类型的实例。引用类类型的任何静态成员。”@AlexeiLevenkov:另请参阅: