.net 当使用默认构造函数实例化继承的类时,它是否也调用基类构造函数?
有人知道C#的行为吗?所有.NET语言都一样吗?是的,它会自动调用基类的默认构造函数。默认构造函数没有参数 如果没有默认构造函数,则必须使用以下语法手动调用基类构造函数:.net 当使用默认构造函数实例化继承的类时,它是否也调用基类构造函数?,.net,.net,有人知道C#的行为吗?所有.NET语言都一样吗?是的,它会自动调用基类的默认构造函数。默认构造函数没有参数 如果没有默认构造函数,则必须使用以下语法手动调用基类构造函数: public MyClass() : base(parameters, ...) 来源:是的。这就是为什么不能创建不调用基类的派生类 public class A { public A(string s) {} } public class B : A { public B() {} }
public MyClass() : base(parameters, ...)
来源:是的。这就是为什么不能创建不调用基类的派生类
public class A
{
public A(string s)
{}
}
public class B : A
{
public B()
{}
}
导致编译器错误。对于C语言肯定是这样的-我不能说对于其他语言,但我无法想象他们的编译器会生成不同的IL
举个例子:
class Parent { }
class Child : Parent { }
如果我们查看子构造函数中生成的IL,我们会看到这一重要行:
L_0001: call instance void Parent::.ctor()
这清楚地表明我们正在调用父类的默认构造函数。是-如果没有显式调用基类构造函数,则派生类中的任何构造函数都会发生这种情况
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)
}
为了补充其他答案,为了让OO正常工作,它必须为每个类调用构造函数。如果不是,你不能保证你的班级处于已知的良好状态
即使在执行某些奇怪的操作(例如序列化)时,它们也需要默认构造函数,因为必须再次调用构造函数。如果基类上有默认构造函数(没有参数),则不会出现编译器错误。事实上,这证明了在不调用基类构造函数的情况下无法创建派生类。如果允许的话,这会起作用。这是所有.NET语言的默认行为吗?这可能是所有面向对象语言的默认行为。直观地说,基类的成员必须在派生类的成员之前设置,否则会得到不可预测的结果。