当使用默认构造函数实例化继承的类时,它是否也调用基类构造函数?

时间:2009-01-12 18:09:48

标签: .net

有谁知道C#的行为是什么?所有.NET语言都一样吗?

5 个答案:

答案 0 :(得分:6)

是的,它会自动调用基类的默认构造函数。默认构造函数没有参数。

如果没有默认构造函数,则必须使用以下语法手动调用基类构造函数:

public MyClass() : base(parameters, ...)

来源:Using Constructors (C#)

答案 1 :(得分:4)

是 - 如果您没有显式调用基类构造函数,则会在派生类中使用任何构造函数。

class Base
{
  Base(){}
  Base(int i){}
}

class Derived : Base
{
  Derived(bool x) {} // calls Base.Base()
}

class Derived2 : Base
{
  Derived2() : base(10) {} // calls Base.Base(int)
}

答案 2 :(得分:1)

是的。这就是您无法创建不调用基类的派生类的原因。

public class A
{
    public A(string s)
    {}
}

public class B : A
{
    public B()
    {}
}

导致编译器错误。

答案 3 :(得分:1)

它肯定适用于C# - 我不能说其他语言,但我无法想象他们的编译器会产生不同的IL。

举个例子:

class Parent { }
class Child : Parent { }

如果我们查看Child构造函数中生成的IL,我们会看到这条重要的行:

L_0001: call instance void Parent::.ctor()

清楚地表明我们正在调用Parent类的默认构造函数。

答案 4 :(得分:0)

只是为了添加其他答案,为了让OO正常工作,它必须为每个类调用一个构造函数。如果没有,你不能保证你的班级已经处于良好的状态。

即使你做了一些奇怪的事情(例如序列化),他们也需要一个默认的构造函数,因为必须再次调用一个构造函数。