2012-03-09 4 views
2

Например, если вы вводите статический класс в исходный код, компилятор csc превращает его в закрытый абстрактный класс (исправьте меня, если я ошибаюсь, пожалуйста).Знает ли IL, что такое ИНТЕРФЕЙС?

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

+4

Если компилятор превратил абстрактный класс в запечатанный, как мог бы любой класс извлечь из него для реализации абстрактных методов? – hvd

+2

Абстрактный класс очень отличается от статического закрытого класса. Что заставило вас думать, что компилятор превратил один в другой? И да, компилятор делает тип интерфейса. –

+0

Вы пытались скомпилировать сборку, а затем посмотреть с ildasm? –

ответ

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

+0

@pencilCake, ответ обновлен. –

7

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

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

+0

Совершенно верно; Я задал вопрос; мой плохой (статический класс -> запечатанный аннотация в IL) – pencilCake

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 в качестве примера.

 Смежные вопросы

  • Нет связанных вопросов^_^