为什么我的c#base构造函数不会被调用?

时间:2014-06-25 15:47:03

标签: c#

public class Animal
{
    public Animal()
    {
        "animal ctor".Dump();
    }
}

public class Cat :Animal
{
    public Cat():this("gray")
    {
        "cat ctor".Dump();
    }

    public Cat(string c):base()
    {
        "cat ctor2".Dump();
    }
}

void Main()
{
    Cat a = new Cat();
}

代码的输出是:

animal ctor
cat ctor2
cat ctor

我理解第一行。

首先调用Animal Ctor,但然后Cat ctor调用字符串重载public Cat(string c):base() - 但这也是基本构造函数的调用。

那么为什么我再也看不到animal ctor:base())?

3 个答案:

答案 0 :(得分:5)

构造函数只调用一次:

  1. 您的Cat()构造函数调用Cat(string c)
  2. Cat(string c)正在调用 base 构造函数
  3. 执行基础构造函数
  4. 执行
  5. Cat(string c)(这是基地的来电者)
  6. 然后执行Cat()构造函数
  7. 基本上,如果你调用 base 构造函数(或类中的其他构造函数),那么在构造函数之前执行。请参阅documentation以获取更多详细信息

答案 1 :(得分:1)

Cat()显式调用显式调用Cat(string)的{​​{1}}。

这些调用在每个方法启动之前发生,因此您会看到它们以相反的顺序转储。

Animal()不会直接调用Cat(),这意味着基类的构造函数只会被调用一次(这可能是你想要的)

如果没有明确指定要调用的构造函数,则调用基类的默认构造函数;以下是:

Animal()

相当于:

public Cat(string c) :base()
{
    "cat ctor2".Dump();
}

答案 2 :(得分:0)

有一些继承和对象构造规则。

这里,构造函数按顺序调用Cat():this(string)是Cat(string):base()是Animal()

动物是猫的基础,所以首先构建动物。一旦Animal()构造函数调用完成,那么Cat(字符串)将完成,随后将完成Cat()调用。

即使你没有提到base(),仍然会调用base。默认情况下始终调用无参数构造函数(如果可用),并将此过程冒泡到层次结构中最顶层的父级。

每个类始终存在无参数构造函数。但是,如果您使用参数声明一个,那么您明确需要声明一个无参数构造函数。