为什么在C#中声明静态类时要标记为sealed和abstract?

9

这篇MSDN文章指出,静态类应该声明为sealed和abstract。我原本认为静态类已经是sealed的了。为什么还需要将静态类声明为sealed呢?


5
该句子的那部分明确指的是除C#以外的其他语言。 - H H
@HenkHolterman 和 VB.NET 也一样,因为 MustInherit 和 NotInheritable 不能同时使用。 - Zaid Masud
4个回答

27
我认为文章中相关的部分是:

“如果你所使用的编程语言没有内置静态类的支持,那就将静态类声明为sealed和abstract,并添加一个私有实例构造函数。”

请记住,.NET框架支持许多不同的编程语言。


18

C# v1不允许在类上使用“static”关键字。因此,如果您有一个仅包含静态方法的类,建议将其声明为“sealed”,“abstract”并将构造函数设置为私有。这意味着没有人可以实例化您的类或尝试从它继承。【从仅具有静态方法的类继承没有意义。】

C# v2允许在类上使用静态关键字,因此您不必使用以上技巧来强制正确使用。


12
  • abstract关键字的一个效果是将类标记为抽象类,因此该类不能被实例化。
  • sealed关键字的一个效果是将类标记为密封类,因此该类不能被继承。

static类实际上就是这样的一种类——既不能被实例化,也不能被继承。

因此,文章并没有说您应该将静态类标记为abstractsealed,但这是静态类在IL中表示的方式。

(其他语言可能会允许您这样做,如果它们没有static关键字,但我怀疑这一点,因为abstract sealed类在语义上并不合理。)


想要为未来的旅行者补充一点,在4.0 IL中,使用static关键字,你会得到类似于'.class private auto ansi sealed'的东西。所以是的,他的答案就是为什么。在C#中,使用static可以移除IL中本来会为你生成的任何默认构造函数,因为在C#中它不能被继承。因此,在C#中,static是“首选”的,只需完成上面的一些答案即可。 - Beeeaaar

0

它似乎在说,如果语言不支持静态类,则将一个类声明为密封和抽象的,并使用私有构造函数是静态类的替代方案。


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