盲目地将结构转换为类来隐藏默认构造函数?

Jon*_*gel 7 .net c# constructor struct default-constructor

我阅读了与此主题相关的所有问题,并且它们都说明了为什么struct在C#上没有默认构造函数的原因,但我还没有找到任何人在面对这种情况时提出一般行动方案.

显而易见的解决方案是简单地将其转换struct为a class并处理后果.

还有其他选择可以保持它struct吗?

我使用我们的一个内部商务API对象遇到了这种情况.设计者将它从a转换class为a struct,现在默认的构造函数(之前是私有的)使对象处于无效状态.

我认为如果我们要将对象保持为a struct,则应该引入一种检查状态有效性的机制(类似于IsValid属性).我遇到了很多阻力,并解释"使用API​​的人不应该使用默认构造函数",这一评论肯定引起了我的注意.(注意:有问题的对象是通过静态工厂方法"正确"构造的,而所有其他构造函数都是internal.)

在没有经过深思的情况下,每个人都只是简单地将他们的structs 转换为classes吗?

编辑:我想看到一些关于如何保持这种类型的对象的建议struct- 上面讨论的对象更适合struct作为a class.

Sam*_*ell 4

对于 a struct,您设计类型,以便默认构造的实例(字段全为零)是有效状态。你不[不应该]任意使用struct而不是class没有充分的理由——使用不可变引用类型没有任何问题。

我的建议:

  • 确保使用 a 的原因struct是有效的([真实的]分析器揭示了由于大量分配非常轻量级的对象而导致的严重性能问题)。
  • 设计类型以使默认构造的实例有效。
  • 如果类型的设计由本机/COM 互操作约束决定,请包装功能并且不要暴露struct包装器外部(私有嵌套类型)。这样您就可以轻松记录并验证约束类型要求的正确使用。