让隐式派生 class 构造函数调用基础 class 构造函数
Letting implicit derived class constructor call base class constructor
public abstract class A {
public A() {
// do stuff
}
}
public class B : A {
// let implicit constructor of class B also call base()
}
我希望派生的 class' 隐式构造函数调用 base()。如何在不为派生的 class B 创建显式构造函数的情况下在 c# 中完成此操作?
已经这样做了;让我们 run your code through sharplab.io 看看 B
:
的 IL
.class public auto ansi beforefieldinit B
extends A
{
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2058
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void A::.ctor()
IL_0006: ret
} // end of method B::.ctor
} // end of class B
我们可以在这里看到 B
有一个 public 无参数构造函数调用 A
的无参数构造函数(在 IL_0001
上)。本质上,
public class B : A {
}
是
的简写
public class B : A {
public B() : base() {}
}
它总是隐式调用基class的构造函数。您可以查看:
public abstract class A {
public A() {
Console.WriteLine("Class A");
}
}
public class B : A {
}
public abstract class A {
public A() {
// do stuff
}
}
public class B : A {
// let implicit constructor of class B also call base()
}
我希望派生的 class' 隐式构造函数调用 base()。如何在不为派生的 class B 创建显式构造函数的情况下在 c# 中完成此操作?
已经这样做了;让我们 run your code through sharplab.io 看看 B
:
.class public auto ansi beforefieldinit B
extends A
{
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2058
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void A::.ctor()
IL_0006: ret
} // end of method B::.ctor
} // end of class B
我们可以在这里看到 B
有一个 public 无参数构造函数调用 A
的无参数构造函数(在 IL_0001
上)。本质上,
public class B : A {
}
是
的简写public class B : A {
public B() : base() {}
}
它总是隐式调用基class的构造函数。您可以查看:
public abstract class A {
public A() {
Console.WriteLine("Class A");
}
}
public class B : A {
}