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

Sha*_*tin 5 c# static abstract sealed

Jon Skeet在他的深度C#中讲述了一个静态类:

它不能被声明为抽象或密封,尽管它两者都是隐含的.

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

Jon*_*eet 19

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

我的意思是那是IL的代表.

例如:

static class Foo {}
Run Code Online (Sandbox Code Playgroud)

生成IL:

.class public abstract auto ansi sealed beforefieldinit Foo
       extends [mscorlib]System.Object
{
} // end of class Foo
Run Code Online (Sandbox Code Playgroud)

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

另外,这就是C#规范引用它的方式:

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

  • 减一,因为你没有引用任何来源.编辑:我刚刚看到分数下降了一个,并想澄清这是一个笑话,我不是downvoter. (10认同)
  • 我想你可能知道作者的真正含义:P (8认同)

小智 5

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

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