【发布时间】:2010-11-28 14:33:52
【问题描述】:
我阅读了与该主题相关的所有问题,它们都给出了为什么 struct 上的默认构造函数在 C# 中不可用的原因,但我还没有找到任何人在遇到问题时提出一般的行动方案这种情况。
显而易见的解决方案是简单地将struct 转换为class 并处理后果。
是否有其他选项可以将其保留为struct?
我在使用我们的一个内部商务 API 对象时遇到了这种情况。设计者将其从class 转换为struct,现在默认构造函数(之前是私有的)使对象处于无效状态。
我认为如果我们要将对象保留为struct,则应该引入一种检查状态有效性的机制(类似于IsValid 属性)。我遇到了很多阻力,并且对“任何使用 API 的人都不应该使用默认构造函数”的解释让我大吃一惊。 (注意:有问题的对象是通过静态工厂方法“正确”构造的,所有其他构造函数都是internal。)
在这种情况下,是否每个人都只是将structs 转换为classes 而不加考虑?
编辑:我希望看到一些关于如何将这种类型的对象保留为struct 的建议——上面讨论的对象更适合作为struct,而不是作为class。
【问题讨论】:
-
这是一个很好的问题。您可以设计一个结构,以使清零状态有效,但仅此一项并不总是构成可用的 API。如果存在默认构造函数,有些人将不可避免地调用它,因为它会在他们的 IDE 中弹出并提供阻力最小的路径。这将导致编译器应该捕获的问题,或者他们会浪费时间尝试在不可变的归零结构上设置属性。我希望 C# 允许您隐藏默认构造函数并强制人们调用 default(...) 如果他们真的想要一个归零的结构。
-
其实研究这个比较多,我觉得可用性问题真的出在Intellisense而不是编译器上。似乎曾几何时,Visual Studio 没有在 Intellisense 中显示默认构造函数,在我看来,这是明智的做法。但是人们抱怨see here 并且在某些时候它一定已经改变了,因为现在 Visual Studio 2010 会弹出空构造函数作为第一个选项。
标签: c# .net constructor struct default-constructor