如果没有可用的重载构造函数,则调用基类的构造函数有什么用?

时间:2011-05-23 10:11:32

标签: c#

我们是否有任何优势或者只是传统的方式来调用基类构造函数,如#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");
    }
}

4 个答案:

答案 0 :(得分:4)

不,没有区别。在#2的情况下,编译器将生成对基类构造函数的调用(如果有一个无参数的基类构造函数,那就是)。手动添加这样的调用是一个样式问题。只有当没有无参数基类构造函数可用时才强制它,因此编译器无法自行决定如何调用它。

答案 1 :(得分:3)

它们基本相同。如果不指定任何内容,则会隐式调用基类的无参数构造函数。

这也是为什么#2 会在基类没有无参数构造函数时给出错误的原因。 (#1 也会,但是#2 给出错误的事实告诉您,即使您没有指定,它也会尝试调用无参数的基础构造函数打电话给它)

答案 2 :(得分:0)

作为一项规则,如果派生类特别需要基类的构造函数在它之前运行,我通常使用#1。实际上,编译器没有区别,但它更清楚地表明存在依赖性。如果您考虑移植到其他平台,这可能非常相关。例如,在Delphi中,构造函数不会调用基类的构造函数,除非您明确告诉它;如果我将代码移植到Delphi,我更有可能记得用#1做到这一点。

例如,如果基类实例化一个列表,并且派生添加到它,我将使用#1。如果派生的构造函数只是初始化一个本地字段,我会使用#2。

答案 3 :(得分:0)

没有区别。 : base()语法存在的原因是您可以调用非默认构造函数(带参数)。如果无法以相同的方式调用默认构造函数,那会感到随意。