C# 在下面的示例中,将首先调用哪个构造函数
在下面的示例中,将首先调用哪个构造函数?当我放置断点并执行它时,首先指向子构造函数,但执行父类构造函数,这是为什么 谁能向我澄清一下吗C# 在下面的示例中,将首先调用哪个构造函数,c#,asp.net,C#,Asp.net,在下面的示例中,将首先调用哪个构造函数?当我放置断点并执行它时,首先指向子构造函数,但执行父类构造函数,这是为什么 谁能向我澄清一下吗 class Program { static void Main(string[] args) { Child child = new Child(); child.print(); Console.ReadLine(); }
class Program
{
static void Main(string[] args)
{
Child child = new Child();
child.print();
Console.ReadLine();
}
}
public class Parent
{
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child()
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
Console.WriteLine("I'm a Child Class.");
}
}
从C#生成构造函数时,首先调用基类,因此:
- 对象()
- 然后父()
- 然后是Child()
base:.ctor({args})
在本地.ctor
出于这个原因,您应该避免在构造期间调用虚拟方法,因为如果子级重写它,它可能会失败,因为子级尚未初始化在其中定义的字段(它们将是零)
在C++/CLI中,您可以选择做事情的顺序。首先构造父级,因为它是子级的核心。 如果子级的核心(父级)不是,则无法构造它 请注意,类的初始化并不限于执行其构造函数。它还初始化其字段 在下面的示例中,您确实希望Child的构造函数显示x=3。如果不是,则意味着派生类不能基于其祖先行为
public class Parent
{
public int x;
public Parent()
{
x = 3;
}
}
public class Child : Parent
{
public Child()
{
Console.WriteLine("Child Constructor. x="+x.ToString());
}
}
严格地说,它已经建成;构造函数只是初始化一些东西。而IIRC是C始终首先做的一个实现细节。在IL级别上,这两种方法都是有效的,IIRC.Marc,你对我添加的示例有何看法?你同意吗?如果是这样的话:当我调试时,为什么编译器首先指向子类构造函数,然后执行父类构造函数。