C#中空构造函数有哪些好处?

3
我来到了一个使用C#编写的现有项目。我发现几个类有空的无参数构造函数,这些构造函数可能是公共的或者是内部的。这些类本身也是公共的或者是内部的。我没有看到其他的构造函数和继承关系。我想知道这样做有什么好处。
我原本以为如果没有构造函数,那么C#编译器总是会创建一个无参数的空构造函数。所以我的问题是:在上述情况下,当前代码是否与没有构造函数的代码有任何不同?我认为唯一的特殊情况是公共类中的内部构造函数。我是否漏掉了其他的东西?

你的意思是空的,就是里面什么都没有... 没有代码... 只有一个声明吗? - Kzryzstof
5
你能否给出你代码中的一个具体例子,以确保我们不会漏掉你认为不重要但很细微的差别?虽然听起来你并没有错过什么,我倾向于同意,这样构造函数就没有意义了。 - Lasse V. Karlsen
有一个可能的重复,提供了一个原因:https://dev59.com/UnA85IYBdhLWcg3wCfLm - Kzryzstof
隐私访问器很重要。编译器为您添加的默认无参数构造函数将是公共的,如果您添加了一个内部/私有构造函数,实际上是防止外部构造。这可能很重要。但是,没有代码的公共无参数构造函数并不重要。 - Lasse V. Karlsen
1
链接答案中的最后一段建议非常糟糕,纯粹而简单。除非可以使用无参数构造函数构造类型,否则不要添加无参数构造函数。API设计比那复杂得多得多。 - Lasse V. Karlsen
在最后一段中,@LasseVågsætherKarlsen的意思是(我猜)始终添加空构造函数而不是依赖编译器在描述的情况下执行该操作。当然,如果空构造函数没有意义,则应定义另一个构造函数。 - Evk
2个回答

6

嗯,“或内部的”是一个重大变化, 默认构造函数将为public。

然而,通常我看到这样做的原因是,如果有人后来添加了特定的构造函数,它不会表示一种破坏性的变化。构造函数很不寻常,因为添加自定义构造函数可能会突然破坏事物,因为它可能会删除默认构造函数; 这有后果 - 包括在运行时之前不显示的东西(例如反序列化),或者直到库的下游消费者抱怨您已经破坏了API。

同样,如果该类型在反射中使用(例如作为插件):只有在运行时才能通过Activator.CreateInstance使用发现由于已删除无参数构造函数导致的错误。

当然,你是否实际需要这样做很大程度上取决于观点。


1
反序列化不会导致编译器错误,这就是Marc所说的。 - Lasse V. Karlsen
我同意你的看法,@MarcGravell。 - Jonesopolis
1
@ppumkin 另一种方式:我在序列化方面工作得非常广泛,我知道有多少次我看到其他人因此而受到严重伤害。 我认为我从来没有亲身经历过这种情况,正是因为我知道所有令人不快的细节 :) 如果你认为大多数人使用干净的DTO模型:你会非常错误。 - Marc Gravell
@ppumkin protobuf-net不需要空构造函数也不需要属性,只是这样说...(你可以告诉它跳过构造函数,如果需要的话,一切都可以在运行时配置) - Marc Gravell
1
@ppumkin 我也在谈论 RuntimeTypeModel API,它允许在运行时进行完全配置,在这里没有版本冲突。 - Marc Gravell
显示剩余5条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接