C#中抽象类中公共构造函数的作用是什么?

33

如果抽象类中的公共构造函数只能由它们的派生类调用,那么它应该与受保护的构造函数在功能上等效。对吗?

在抽象类中声明公共构造函数和受保护构造函数之间有什么区别?你会用它来做什么?为什么编译器不会报错?

3个回答

26

完全正确。你应该更加倾向于使用受保护的构造函数。

编辑:编译器不会报错,但是像FxCop(和代码分析)这样的工具会有警告。我认为在抽象类的公共构造函数上可能存在一些奇怪的反射技巧,但从为其他开发人员编写子类提供基类功能的角度来看,应该使用受保护的构造函数。


同意。这里有更详细的内容:https://dev59.com/-nE85IYBdhLWcg3wmEpW - Gaurav Arora

4

你是正确的。在抽象类中,公共构造函数与受保护的构造函数在功能上是等价的。

我更喜欢在这种情况下使用受保护的构造函数。

虽然编译器不会对此抱怨,但编译器会抱怨尝试生成抽象类的实例。Visual Studio也足够聪明,如果您尝试实例化抽象类,则不会提供Intellisense。


有一些反射的边缘情况可以通过将抽象类构造函数公开来简化...但它们非常罕见。我通常认为抽象类中的构造函数应该是受保护的(如果它们被其他构造函数重载调用,则为私有)。 - LBushkin

2

是的,你说得对,在抽象类中,公共构造函数实际上没有用处,因为你无法创建它们。

然而,编译器不会抱怨,因为在c#的语境下,有很多无用的东西可以写,但它将无法检查其逻辑含义,只能检查其所设置的解析规则。

当然,c#的创建者专注于创建编译语法(规则),这些规则实际上是有害的,违反了语言使用规范。


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