Знает ли IL, что такое ИНТЕРФЕЙС? - PullRequest
2 голосов
/ 10 марта 2012

Например, когда вы вводите статический класс в исходный код, компилятор csc превращает его в запечатанный абстрактный класс (поправьте меня, если я ошибаюсь, пожалуйста).

Но как насчет интерфейса; Знает ли CLR, что такое интерфейс? Или компилятор преобразует его в какое-то объявление типа?

Ответы [ 4 ]

10 голосов
/ 10 марта 2012

Например, когда вы вводите абстрактный класс в свой исходный код, компилятор 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
{
}
7 голосов
/ 10 марта 2012

Вы не правы, это static class, который конвертируется в эквивалент sealed abstract class.

И интерфейсы являются полными членами .NET, с отличными метаданными и поведением (например, множественным наследованием), отличным от любогодругой вид типа.

3 голосов
/ 10 марта 2012

Вот что 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 голос
/ 10 марта 2012

Вот как интерфейс выглядит в 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 взят в качестве примера.

...