2009-08-12 94 views
6

This MSDN article指出静态类应声明为密封和抽象。我的印象是静态类已经被封闭了。为什么你还需要声明一个静态类为密封?为什么要在C#中声明静态类为密封和抽象?

+5

句子的那部分明确提到其他语言比C# – 2009-08-12 22:09:33

+0

@HenkHolterman和VB.NET为好,因为为MustInherit和NotInheritable不能一起使用。 – 2012-08-26 03:08:16

回答

23

我认为那篇文章的相关位:

“不要声明静态类的密封和抽象,并添加一个私有实例构造函数,如果你的编程语言不具有内置静态类的支持

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

0

它似乎是说如果语言不支持静态类,那么声明一个类作为密封并用私有构造函数抽象是静态类的替代方法。

16

C#v1不允许在类上使用“static”关键字。所以如果你有一个只有静态方法的类,建议声明它是'密封','抽象',并使构造函数为私有。这意味着没有人可以实例化你的类或尝试从它继承。 [这是没有意义的,只有静态方法的类继承。]

C#V2允许在一个类中的static关键字,这样你就不必使用上述伎俩执行正确的用法。

11
  • 将类别标记为abstract的其中一个影响是它无法实例化。
  • 将类标记为sealed的其中一个影响是无法继承。

这就是static类实际上是 - 一个无法实例化,不能被继承的类。

所以这篇文章没有说明你应该另外标记你的静态类为abstractsealed,但这就是如何在IL中表示静态类的方式。

(其他语言可能允许你这样做,如果他们没有一个static关键字,但我对此表示怀疑,因为abstract sealed类没有做出很大的意义语义。)

+0

想要为未来的旅行者添加4.0 IL,使用静态,你会得到'.class private auto ansi sealed'之类的东西。所以是的,他的回答是*为什么*。在C#中使用静态它删除,将有你,因为在C#中它不能被继承了生成IL任何默认构造函数。所以在C#中静态是'首选',只需完成一些上述的答案。 – Celess 2013-07-15 20:46:25