Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在第一次调用类方法之前不调用静态构造函数_C#_.net - Fatal编程技术网

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

C# 为什么在第一次调用类方法之前不调用静态构造函数,c#,.net,C#,.net,根据Jon Skeet的文章和讨论,静态构造函数必须在第一次调用类的方法之前被调用 由于某些原因,以下代码不显示此行为: namespace AbstractAndStatic { class Program { static void Main(string[] args) { StaticClass.Equals(1,2); StaticClass.foo(); } }

根据Jon Skeet的文章和讨论,静态构造函数必须在第一次调用类的方法之前被调用

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

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,您将看到编译器已经解析了对just
Object.Equals(1,2)
的调用。如果您没有调用实际涉及静态类的方法,则不需要对其进行初始化。

我认为您需要重写Object.Equals。目前,它正在调用基本版本。顺便说一句,每个类都从object继承,所以不必手动执行。Equals()方法写在哪里?@MicrosoftDN它是从
object继承的。Equals
@RonBeyer:不,它调用的是
静态Equals(object,object)
方法。@Jonsket在发布该方法之前大约30秒就知道了:)注意“它不需要初始化“-如果框架决定更早调用静态构造函数,它仍然是有效的行为。@AlexeiLevenkov:不,不会。如果一个类型有一个静态构造函数,它保证只在第一次引用该类的成员之前执行。您可能会考虑何时初始化没有静态构造函数的类型,这要宽松得多。具体来说,从C#规范中可以看出:“静态构造函数的执行是由应用程序域中发生的以下第一个事件触发的:创建类类型的实例。引用类类型的任何静态成员。”@AlexeiLevenkov:另请参阅: