在下面的示例中,将首先调用哪个构造函数

时间:2011-06-25 16:40:16

标签: c# asp.net

在下面的示例中,首先调用哪个构造函数?当我提出断点并执行它时,首先指向子构造函数但执行了父类构造函数,为什么会这样?

任何人都可以澄清一下吗?

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.");
        }
    }

2 个答案:

答案 0 :(得分:4)

从C#生成的构造函数首先被调用基类,所以:

  • 对象()
  • 然后是Parent()
  • 然后Child()

基本上,已链接的base:.ctor({args})会附加到本地.ctor

出于这个原因,你应该避免在构造期间调用虚方法,就像Child覆盖它一样,它可能会失败,因为Child还没有初始化那里定义的字段(它们将是零)。

在C ++ / CLI中,您可以选择执行的操作顺序。

答案 1 :(得分:0)

首先构建父,因为它是Child的核心。 如果孩子的核心(父母)没有,则无法构建孩子。

请注意,类的初始化不仅限于执行其构造函数。它还初始化其字段。

在下面的示例中,您确实希望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()); 
    } 
  }