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时,如果condition为true并且调用B()构造函数时,由于某些原因,我不理解程序的输出是"A constructor called"。
你能帮忙解释一下吗?
谢谢!
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");
}
}