我对C#中“默认构造函数”的含义感到非常困惑。许多人,包括我的编程教授,都只是将任何无参数的构造函数称为“默认构造函数”(例如此处或此处的问题和解答)。甚至default-constructor上的SO标签Wiki也说它是“无参数的构造器...经常(请注意,它经常(并非总是)说)由编译器生成”。
如果要遵循此逻辑,则构造函数是否为“默认”取决于您如何调用它。即,如果您可以将其称为“默认”方式,而无需任何参数,则它是默认构造函数。
但是,如果我正确阅读的话,MSDN似乎仅将“默认构造函数”命名为无参数构造函数,该无参数构造函数在未指定其他构造函数的情况下隐式生成,并调用无参数基类构造函数,并且(像其他任何构造函数一样)将class
的字段初始化为其值。
考虑一下,这比"default" == "parameterless"
以下更有意义:当您未选择其他任何东西时,隐式生成的构造函数有点像默认选项。
因此,将所有无参数的构造函数都调用默认构造函数是否正确?
或者是它正确调用明确定义形式的构造函数public C(): base() {}
(普通班)和protected C(): base() {}
(抽象类)默认的构造函数,因为它们适合在MSDN默认构造函数的说明?
还是该术语真的仅适用于隐式生成的构造函数?
另外(可能是最重要的问题):对该术语最广泛接受的定义是正确的还是不正确的?
不只是MSDN使用术语“默认构造函数”专门为构造函数提供了“如果您不指定其他任何内容”或“始终为结构(C#6之前的版本)”或“始终为结构提供”的构造函数,除非您指定自己的无参数构造函数(C#6)”-这是C#语言规范本身。请注意,在使用结构的情况下,编译器无需在IL中为您生成一个结构-它已经作为类型系统的一部分存在。
我个人认为这是一个有用的区分-特别是在专门讨论构造函数语义时。当构造函数不是讨论的重点时,例如,如果有人在谈论LINQ并描述以下代码,那么琐地研究它就没有多大用处了:
List<int> x = new List<int>();
x.Add(10);
int y = x.First();
...为其调用默认构造函数List<T>
,然后再添加它,等等-那么挑剔我们实际上在调用无参数构造函数毫无意义。(我们甚至在不查看源代码的情况下都无法确定它是否是默认构造函数-该概念仅在实现中才有意义,而不是像从外部那样有意义。)
还有一个细微的区别,即使是规范也出错了(我应该提出一个错误)。考虑一下C#5规范中的以下语句:
如果一个类不包含实例构造函数声明,则会自动提供一个默认的实例构造函数。该默认构造函数仅调用直接基类的无参数构造函数。
不一定是这样。即使Base
没有无参数构造函数,该代码也可以正常编译:
public class Base
{
public Base(int x = 0)
{
Console.WriteLine("Base: x={0}", x);
}
}
public class Derived : Base
{
}
谈论默认构造函数来调用基类构造函数,就好像存在显式调用一样base()
,并进行正常的重载解析等过程,这样会更准确。
下一个:
另外(可能是最重要的问题):对该术语最广泛接受的定义是正确的还是不正确的?
我要说的是,大多数人甚至都没有考虑它,而是可以互换使用这两个术语。他们认为定义是一种方法还是另一种方法不是问题-我怀疑定义它的想法对大多数人而言并不普遍。(这并不是要贬低他们-这并不是他们发现他们需要关心的事情。并不是每个人都想成为一名语言律师。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句