问题描述
|
我们有优势吗?还是像#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\");
}
}
解决方法
不,没有区别。在情况2中,编译器将生成对基类构造函数的调用(即,如果有可用的无参数基类构造函数)。手动添加这样的呼叫是一个样式问题。只有在没有可用的无参数基类构造函数时,它才是强制性的,因此编译器无法自行决定如何调用它。
,它们基本上是相同的。如果您不指定任何内容,则隐式调用基类的无参数构造函数。
这就是为什么#2在基类没有无参数构造函数的情况下会给您一个错误的原因。 (#1也会,但是#2会给您一个错误的事实告诉您,即使您未指定对其的调用,它也会尝试调用无参数的基本构造函数)
,通常,如果派生类特别需要基类的构造函数在其之前运行,则通常使用#1。实际上,编译器没有什么区别,但是更清楚地表明存在依赖性。如果您考虑移植到其他平台,这可能非常相关。例如,在Delphi中,除非您明确地告诉构造函数,否则构造函数不会调用基类的构造函数。如果我将代码移植到Delphi,我将更可能记得使用#1进行此操作。
例如,如果基类实例化一个列表,而派生类将其添加到列表中,则我将使用#1。如果派生的构造函数仅初始化一个本地字段,则使用#2。
,没有区别。之所以存在
: base()
语法,是因为您可以调用非默认构造函数(带有参数)。如果不能以相同的方式调用默认构造函数,那将是任意的。