c#静态构造函数和子实例

本文关键字:实例 构造函数 静态 | 更新日期: 2023-09-27 18:02:39

我有以下场景:

Class A
{
    public static  A instance;
    static A()
    {
        if(condition)
        {
            instance = new B();
        }
        else
        {
            instance = new A();
        }
    }
    public A()
    {
        WriteSomething();
    }
    virtual void WriteSomething()
    {
        Console.WriteLine("A constructor called");
    }
}

Class B : A
{
    public B()
    {
        WriteSomething();
    }
    override void WriteSomething()
    {
        Console.WriteLine("B constructor called");
    }
}

问题是,当第一次调用A.instance时,如果conditiontrue并且调用B()构造函数时,由于某些原因,我不理解程序的输出是"A constructor called"。

你能帮忙解释一下吗?

谢谢!

c#静态构造函数和子实例

A的构造函数将总是首先运行,即使您正在创建一个新的B,因为B扩展了A

您还无意中发现了为什么建议不要在构造函数中放置虚函数调用(至少在。net中)。

http://msdn.microsoft.com/en-us/library/ms182331.aspx

"当调用虚拟方法时,直到运行时才选择执行该方法的实际类型。当构造函数调用虚方法时,调用该方法的实例的构造函数可能尚未执行。"

A. writessomething()将总是给你"一个构造函数" b . writessomething()将总是给你"一个构造函数"但是,在构造函数场景中,没有调用override,您可以使用new关键字创建具有相同名称的新空。这是你想要的方式,除了一个虚拟覆盖调用。然而,上面的代码并不是一个很好的实现。

Class A
{
    public static  A instance;
    static A()
    {
        if(condition)
        {
            instance = new B();
        }
        else
        {
            instance = new A();
        }
    }
    public A()
    {
        WriteSomething();
    }
    public static void WriteSomething()
    {
        Console.WriteLine("A constructor called");
    }
}

Class B : A
{
    public B()
    {
        WriteSomething();
    }
    public static new void WriteSomething()
    {
        Console.WriteLine("B constructor called");
    }
}