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

.net 当使用默认构造函数实例化继承的类时,它是否也调用基类构造函数?,.net,.net,有人知道C#的行为吗?所有.NET语言都一样吗?是的,它会自动调用基类的默认构造函数。默认构造函数没有参数 如果没有默认构造函数,则必须使用以下语法手动调用基类构造函数: public MyClass() : base(parameters, ...) 来源:是的。这就是为什么不能创建不调用基类的派生类 public class A { public A(string s) {} } public class B : A { public B() {} }

有人知道C#的行为吗?所有.NET语言都一样吗?

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

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

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语言的默认行为吗?这可能是所有面向对象语言的默认行为。直观地说,基类的成员必须在派生类的成员之前设置,否则会得到不可预测的结果。