【问题标题】:Why static constructor not called before first call to class method为什么在第一次调用类方法之前不调用静态构造函数
【发布时间】:2015-12-08 03:25:11
【问题描述】:

根据 Jon Skeet 的文章C# and beforefieldinitWhen 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 调试器调试上述代码。当 StaticClass.Equals(1,2); 在 Main 方法中执行语句时,不会调用静态构造函数,但是当执行 StaticClass.foo(); 时,它会调用静态构造函数,然后调用 foo 方法。

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

【问题讨论】:

  • 我相信你需要重写 Object.Equals。就目前而言,它正在调用基本版本。顺便说一句,每个类都继承自对象,因此无需手动进行。
  • 你的 Equals() 方法写在哪里?
  • @MicrosoftDN 继承自 Object.Equals
  • @RonBeyer:不,它正在调用static Equals(Object, Object) 方法。
  • @JonSkeet 在您发布之前大约 30 秒就知道了:)

标签: c# .net


【解决方案1】:

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

【讨论】:

  • 请注意“它不需要被初始化”——如果框架决定提前调用静态构造函数,它仍然是有效的行为。
  • @AlexeiLevenkov:不,不会。如果一个类型有一个静态构造函数,它保证只在第一次引用该类的成员之前立即执行。您可能正在考虑何时初始化没有静态构造函数的类型,这要宽松得多。具体来说,来自 C# 规范:“静态构造函数的执行由在应用程序域中发生的以下事件中的第一个触发:创建类类型的实例。引用类类型的任何静态成员。”
猜你喜欢
  • 2012-08-30
  • 2014-12-07
  • 2011-02-07
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2014-02-25
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多