静态类以什么方式隐式抽象?

时间:2015-02-18 19:54:19

标签: c# static abstract sealed

Jon Skeet在他的“深度C#”一书中谈到了静态类:

  

它不能被宣布为抽象或密封,尽管它两者都是隐含的。

抽象类是派生类型的基类。我们只能通过实例化一个派生类型来实例化一个抽象类。另一方面,我们不能从密封的类中获得任何东西。在许多意义上,一个密封的,抽象的课程将毫无用处。 Skeet的意思是静态类既抽象又密封?他只是在谈论无法直接实例化它吗?

4 个答案:

答案 0 :(得分:19)

  

Skeet的意思是静态类既抽象又密封?

我的意思是那是IL中的代表。

例如:

static class Foo {}

生成IL:

.class public abstract auto ansi sealed beforefieldinit Foo
       extends [mscorlib]System.Object
{
} // end of class Foo

因此,即使是一种不了解静态类的语言也会阻止你从中派生另一个类,并阻止你实例化它。

此外,C#规范如何引用它:

  

静态类可能不包含sealed或abstract修饰符。但请注意,由于静态类无法实例化或派生自,因此它的行为就像是密封和抽象一样。

答案 1 :(得分:5)

CIL没有静态类。 CIL有抽象类,并有密封类。抽象类不能直接实例化(尽管具体类可以从抽象类派生)。密封的类不能从中派生出来。结合这些,您可以使用C#编译器来实现静态类。

顺便提一下,CIL没有静态类这一事实意味着静态类作为泛型类型参数的限制在CIL中也不存在。给定static class X,CIL允许您创建C#称之为List<X>的内容。但是,鉴于不能存在X或从中派生的任何类的任何实例,您可以在此类列表中存储的唯一值是null

答案 2 :(得分:1)

它是隐式抽象的,因为你无法实例化该类。

它是隐式密封的,因为你无法从中得到它。

答案 3 :(得分:1)

这意味着它是隐式抽象的,因为类无法实例化 它是隐式密封的,因为你无法扩展或继承它。