// Простой базовый класс.
.class public MyBaseClass {}
// Теперь MyDerivedClass реализует IMylnterface
// и расширяет MyBaseClass.
.class public MyDerivedClass
extends MyNamespace.MyBaseClass
implements MyNamespace.IMyInterface {}
}
На заметку!
Конструкцияextends должна предшествовать конструкции implements. Кроме того, в конструкции implements может содержаться список интерфейсов с разделителями-запятыми Вспомните из главы 8, что интерфейсы могут выступать в роли базовых для других типов интерфейсов, позволяя строить иерархии интерфейсов. Однако вопреки возможным ожиданиям применять атрибут extends
А от интерфейса В в CIL нельзя. Атрибут extends используется только для указания базового класса типа. Когда интерфейс необходимо расширить, снова будет применяться атрибут implements, например:// Расширение интерфейсов в CIL.
.class public interface IMyInterface {}
.class public interface IMyOtherInterface
implements MyNamespace.IMyInterface {}
Определение структур в CIL
Директива .class
System.ValueType. Кроме того, такая директива .class должна уточняться атрибутом sealed (учитывая, что структуры никогда не могут выступать в роли базовых для других типов значений). Если попытаться поступить иначе, тогда компилятор ilasm.exe выдаст сообщение об ошибке.// Определение структуры всегда является запечатанным.
.class public sealed MyStruct
extends [System.Runtime]System.ValueType{}
Имейте в виду, что в CIL предусмотрен сокращенный синтаксис для определения типа структуры. В случае применения атрибута value
[System.Runtime]System.ValueType. Следовательно, тип MyStruct можно было бы определить и так:// Сокращенный синтаксис объявления структуры.
.class public sealed value MyStruct{}
Определение перечислений в CIL
Перечисления .NET Core порождены от класса System.Enum
System.ValueType (и потому также должен быть запечатанным). Чтобы определить перечисление в CIL, необходимо просто расширить [System.Runtime]System.Enum:// Перечисление.
.class public sealed MyEnum
extends [System.Runtime]System.Enum{}
Подобно структурам перечисления могут быть определены с помощью сокращенного синтаксиса, используя атрибут enum
// Сокращенный синтаксис определения перечисления.
.class public sealed enum MyEnum{}
Вскоре вы увидите, как указывать пары "имя-значение" перечисления.
Определение обобщений в CIL
Обобщенные типы также имеют собственное представление в синтаксисе CIL. Вспомните из главы 10, что обобщенный тип или член может иметь один и более параметров типа. Например, в типе List
Dictionary — два. В CIL количество параметров типа указывается с применением символа обратной одиночной кавычки ('), за которым следует число, представляющее количество параметров типа. Как и в С#, действительные значения параметров типа заключаются в угловые скобки.На заметку!
На большинстве клавиатур символ' находится на клавише, расположенной над клавишей <ТаЬ> (и слева от клавиши <1>).Например, предположим, что требуется создать переменную List
Т — тип System.Int32. В C# пришлось бы написать такой код:void SomeMethod()
{
List
}
В CIL необходимо поступить следующим образом (этот код может находиться внутри любого метода CIL):
// В C#: List
newobj instance void class [System.Collections]
System.Collections.Generic.List`1
Обратите внимание, что обобщенный класс определен как List'1
List имеет единственный параметр типа. А вот как определить тип Dictionary:// В C#: Dictionary