栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么不能为.NET中的结构定义默认构造函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么不能为.NET中的结构定义默认构造函数?

注意: 下面的答案是在C#6之前写的很久的,它计划引入在结构中声明无参数构造函数的功能-
但仍然不会在所有情况下都调用它们(例如,用于数组创建)

(最后此功能未添加到C#6中)。


编辑:由于Grauenwolf对CLR的了解,我已经编辑了以下答案。

CLR允许值类型具有无参数的构造函数,但C#不允许。我相信这是因为它将带来一种期望,即在不调用构造函数时会调用它。例如,考虑一下:

MyStruct[] foo = new MyStruct[1000];

仅通过分配适当的内存并将其全部清零,CLR就能非常有效地做到这一点。如果必须将MyStruct构造函数运行1000次,效率将大大降低。(事实上,它没有-
如果你 这样做 有一个参数的构造函数,当你创建一个数组没有得到执行,或者当你有一个未初始化的实例变量。)

C#中的基本规则是“任何类型的默认值都不能依赖任何初始化”。现在,他们 可以 允许定义无参数的构造函数,但随后又不需要在所有情况下都执行该构造函数-
但这会导致更多的混乱。(或者至少,所以我相信论点是正确的。)

编辑:使用您的示例,当有人这样做时,您想发生什么:

Rational[] fractions = new Rational[1000];

它应该在构造函数中运行1000次吗?

  • 否则,我们将得出1000个无效理智
  • 如果是这样,那么如果我们要用实数值填充数组,那么我们可能会浪费大量的工作。

编辑:(回答了更多的问题)无参数构造函数不是由编译器创建的。就CLR而言,值类型不必具有构造函数-尽管事实证明,如果您使用IL编写它,它就 可以
。当您

new Guid()
在C#中编写“
”时,将发出与调用常规构造函数时不同的IL。有关此方面的更多信息,请参见此SO问题。

怀疑 在无参数构造函数的框架中没有任何值类型。毫无疑问,NDepend可以告诉我我是否足够好……C#禁止它的事实足以让我认为这可能是一个坏主意。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/465658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号