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,你对我添加的示例有何看法?你同意吗?如果是这样的话:当我调试时,为什么编译器首先指向子类构造函数,然后执行父类构造函数。