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

本文关键字:构造函数 基类 什么 调用 重载 如果没有 | 更新日期: 2023-09-27 17:57:13

我们有什么优势吗,或者只是传统地调用像#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()语法存在的原因是,您可以调用非默认构造函数(带参数)。如果不能以相同的方式调用默认构造函数,那将感觉很武断。