有谁知道C#的行为是什么?所有.NET语言都一样吗?
答案 0 :(得分:6)
是的,它会自动调用基类的默认构造函数。默认构造函数没有参数。
如果没有默认构造函数,则必须使用以下语法手动调用基类构造函数:
public MyClass() : base(parameters, ...)
答案 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正常工作,它必须为每个类调用一个构造函数。如果没有,你不能保证你的班级已经处于良好的状态。
即使你做了一些奇怪的事情(例如序列化),他们也需要一个默认的构造函数,因为必须再次调用一个构造函数。