Note:下面的答案是在 C# 6 之前很长时间写的,C# 6 计划引入在结构中声明无参数构造函数的能力 - 但它们仍然不会在所有情况下被调用(例如,用于数组创建)(在结束这个功能未添加到 C# 6 https://stackoverflow.com/questions/31063109/parameterless-constructors-in-structs-for-c-sharp-6)...但是然后它was 在 C# 10 中添加 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/parameterless-struct-constructors- 但存在限制,因此您不能期望构造函数在每种情况下都运行。
编辑:由于 Grauenwolf 对 CLR 的深入了解,我编辑了下面的答案。
CLR 允许值类型具有无参数构造函数,但 C# 不允许。我相信这是因为它会引入一种期望,即构造函数在不调用时会被调用。例如,考虑一下:
MyStruct[] foo = new MyStruct[1000];
CLR 只需分配适当的内存并将其全部清零即可非常有效地完成此操作。如果必须运行 MyStruct 构造函数 1000 次,效率就会低很多。 (事实上,事实并非如此——如果你do有一个无参数构造函数,当您创建数组或有未初始化的实例变量时,它不会运行。)
C# 中的基本规则是“任何类型的默认值都不能依赖于任何初始化”。现在他们could允许定义无参数构造函数,但并不要求在所有情况下都执行该构造函数 - 但这会导致更多混乱。 (或者至少,所以我相信这个论点是成立的。)
编辑:以您的示例为例,当有人这样做时您希望发生什么:
Rational[] fractions = new Rational[1000];
它应该运行你的构造函数 1000 次吗?
- 如果不是,我们最终会得到 1000 个无效理性
- 如果确实如此,那么如果我们要用实际值填充数组,我们可能会浪费大量工作。
编辑:(回答更多问题)无参数构造函数不是由编译器创建的。就 CLR 而言,值类型不必具有构造函数 - 尽管事实证明确实如此can如果你用IL写的话。当你写“new Guid()
" 在 C# 中,它发出的 IL 与调用普通构造函数时得到的 IL 不同。请参阅这个问题 https://stackoverflow.com/questions/203695/structure-vs-class-in-c关于这方面的更多信息。
I suspect框架中没有任何具有无参数构造函数的值类型。毫无疑问,如果我问得足够好,NDepend 可以告诉我... C# 禁止它的事实对我来说是一个足够大的暗示,让我认为这可能是一个坏主意。