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 に答える