【问题标题】:Static Constructor in derived class getting invoked first then the base class先调用派生类中的静态构造函数,然后调用基类
【发布时间】:2012-06-27 19:25:01
【问题描述】:

我想知道,通常在 C# 中,构造函数的概念是,基类 cons 应该首先执行,但为什么我看到派生类静态构造函数被调用,然后是基类 cons。有人可以解释一下吗? :(

【问题讨论】:

  • "derived d = new base(); where base is abstract" 错误 - 如果 base 是抽象的 - 你不能更新它。
  • :( 是的......对不起......我的意思是说 Base b = new Derived();

标签: c# .net


【解决方案1】:

静态构造函数初始化类本身,也就是说,它们必须在访问任何其他静态成员之前以及在创建类的任何实例之前调用。

至于在类层次结构中调用静态构造函数的顺序,您应该考虑未定义。来自MSDN page on static constructors

用户无法控制程序中何时执行静态构造函数。

【讨论】:

  • 谢谢。但我看到派生类静态 cons 被称为派生 d = new base();其中 base 是抽象的。我想知道为什么即使我调用 Base b = new Base();和 b.Sub();
  • @Divine:对不起,我不确定我理解你的意思。请注意,对于类层次结构class B : A { },必须在 A 之前调用 BA 的静态构造函数(以未定义的顺序)或者一个 B 可以被实例化。另一方面,在访问静态成员时,只保证为包含静态成员的类调用静态构造函数。另请参阅:What's the best way to ensure a base class's static constructor is called?.
  • (以未定义的顺序)使我的澄清得到解决。现在我很清楚,您非常正确地理解了我的问题/我得到了我所期望的。对不起,我的沟通有点差:) 干杯。非常感谢……
【解决方案2】:

嗯,这就是静态构造函数的全部意义所在;它与继承无关。

引用MSDN

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

您可以声明它们的主体,但不必担心何时调用它们(框架在这方面也没有给您任何保证,除了它在任何实例之前运行已创建手头的类)。

编辑

哦,还有一些你应该注意的事情,它与泛型有关,尽管它可能很明显。

考虑一下这个sn-p:

class Foo<T> {
    static Foo() {
        Console.WriteLine("Danger, Will Robinson!");
    }
}

这里的静态构造函数将针对T 执行,因为当然:

typeof(Foo<Bar>) != typeof(Foo<Baz>)

【讨论】:

  • 我看到当我实际创建这样的语句时,我总是得到像“我来自派生”、“我来自基地”这样的输出:派生 d = new base();其中 base 是抽象类。
  • 如果base是一个抽象类,你怎么实例化它?
  • 然后我改成这样:base b = new base();然后 b.Add();我仍然看到派生的静态构造函数将内容首先放在控制台中:(Whyyy
  • Uhmm Base b = new derived();抱歉......这样......我正在实例化......以了解覆盖和新的概念......
  • 1) 贴一些代码,看在皮特的份上。 2) 甚至更重要的是:我们已经告诉过您为什么静态构造函数首先执行:这是它的设计目的,以便您知道在哪里执行应该发生一次且仅一次的初始化任务。
【解决方案3】:

Derived 类的静态构造函数首先被调用,因为它是在 Base 类之前加载的。类加载到内存时调用构造函数。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2015-08-18
    • 2016-07-19
    • 2020-11-28
    • 2011-09-17
    • 2018-07-21
    • 2018-07-16
    • 2015-06-12
    • 2011-05-03
    相关资源
    最近更新 更多