2

例如,当您在源代码中引入静态类时,csc 编译器会将其转换为密封的抽象类(如果我错了,请纠正我)。

但是接口呢?CLR 知道接口是什么吗?还是编译器将其转换为某种类型声明?

4

4 回答 4

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
{
}
于 2012-03-09T21:51:13.560 回答
7

你错了,它static class是转换为等效的sealed abstract class.

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

于 2012-03-09T21:50:30.810 回答
3

以下是 ILSpy 针对以下代码显示的内容。

C#:

interface A
{
    void M();
}

伊利诺伊:

.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

所以,是的,它确实知道。

于 2012-03-09T21:51:46.213 回答
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 为例。

于 2012-03-09T21:53:47.167 回答