2012-03-09 55 views
2

例如,当您在源代码中引入一个静态类时,csc编译器会将它变成一个密封的抽象类(请纠正我,如果我错了,请)。IL知道INTERFACE是什么吗?

但接口如何? CLR是否知道接口是什么?或者编译器将它转换为某种类型的声明?

+4

如果编译器将抽象类变成了密封类,那么为了实现抽象方法,任何类都可能从它派生出来? – hvd 2012-03-09 21:49:09

+2

抽象类与静态密封类非常不同。是什么让你认为编译器将一个变成了另一个?是的,编译器确实创建了一个接口类型。 – 2012-03-09 21:49:22

+0

您是否尝试编译程序集,然后使用ildasm查看? – 2012-03-09 21:49:22

回答

10

例如,当你在你的源代码引入一个抽象类, CSC编译器把它变成一个密封的静态类(纠正我,如果我错了 ,请)。

我在纠正你。

一个抽象类,如:

public abstract class Foo 
{ 

} 

看起来像这样在IL:

.class public abstract auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object 
{ 
    .method family hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
    } 
} 

但如何对接口; CLR是否知道接口是什么?

是的,它知道。例如:

public interface IFoo 
{ 

} 

翻译成:

.class public interface abstract auto ansi IFoo 
{ 
} 
+0

我纠正了这个问题;我在帖子后注意到了它;抱歉。 – pencilCake 2012-03-09 21:54:03

+0

@ pencilCake,答案已更新。 – 2012-03-09 21:55:43

7

你错了,它是static class,它被转换成等效sealed abstract class

接口是.NET的完整成员,具有不同于任何其他类型的元数据和行为(例如多继承)。

+0

完全正确;我已经解决了这个问题;我的坏(静态类 - > IL中的密封摘要) – pencilCake 2012-03-09 21:53:13

3

这里就是ILSpy给出了下面的代码。

C#:

interface A 
{ 
    void M(); 
} 

IL:

.class interface nested private auto ansi abstract A 
{ 
    // Methods 
    .method public hidebysig newslot abstract virtual 
     instance void M() cil managed 
    { 
    } // end of method A::M 

} // end of class A 

所以,是的,它不知道。

1

这是一个接口是什么样子的CLR:

.class public interface abstract auto ansi IDisposable 
{ 
    .custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) } 
    .method public hidebysig newslot abstract virtual instance void Dispose() cil managed 
    { 
    } 
} 

了IDisposable为例。