我们是否有任何优势或者只是传统的方式来调用基类构造函数,如#1, #1和#2的区别是什么? (当我碰巧为BaseClass重载构造函数时,我使用了#2,但为什么我们这样做。)
public class BaseClass
{
public BaseClass()
{
Console.WriteLine("From Base");
}
}
#1
public class DerivedClass
: BaseClass
{
public DerivedClass()
:base()
{
Console.WriteLine("From Derived");
}
}
#2
public class DerivedClass
: BaseClass
{
public DerivedClass()
{
Console.WriteLine("From Derived");
}
}
答案 0 :(得分:4)
不,没有区别。在#2的情况下,编译器将生成对基类构造函数的调用(如果有一个无参数的基类构造函数,那就是)。手动添加这样的调用是一个样式问题。只有当没有无参数基类构造函数可用时才强制它,因此编译器无法自行决定如何调用它。
答案 1 :(得分:3)
它们基本相同。如果不指定任何内容,则会隐式调用基类的无参数构造函数。
这也是为什么#2 会在基类没有无参数构造函数时给出错误的原因。 (#1 也会,但是#2 给出错误的事实告诉您,即使您没有指定,它也会尝试调用无参数的基础构造函数打电话给它)
答案 2 :(得分:0)
作为一项规则,如果派生类特别需要基类的构造函数在它之前运行,我通常使用#1。实际上,编译器没有区别,但它更清楚地表明存在依赖性。如果您考虑移植到其他平台,这可能非常相关。例如,在Delphi中,构造函数不会调用基类的构造函数,除非您明确告诉它;如果我将代码移植到Delphi,我更有可能记得用#1做到这一点。
例如,如果基类实例化一个列表,并且派生添加到它,我将使用#1。如果派生的构造函数只是初始化一个本地字段,我会使用#2。
答案 3 :(得分:0)
没有区别。 : base()
语法存在的原因是您可以调用非默认构造函数(带参数)。如果无法以相同的方式调用默认构造函数,那会感到随意。