Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:

Определение и реализация интерфейсов в CIL
Несколько странно, но типы интерфейсов в CIL определяются с применением директивы .class. Тем не менее, когда директива .class декорирована атрибутом interface, тип трактуется как интерфейсный тип CTS. После определения интерфейс можно привязывать к типу класса или структуры с использованием атрибута implements:
.namespace MyNamespace
{
// Определение интерфейса.
.class public interface IMyInterface {}
// Простой базовый класс.
.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 может использоваться для определения любой структуры CTS, если тип расширяет 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<T> определен один параметр типа, а в Dictionary<TKey,TValue> — два. В CIL количество параметров типа указывается с применением символа обратной одиночной кавычки ('), за которым следует число, представляющее количество параметров типа. Как и в С#, действительные значения параметров типа заключаются в угловые скобки.
На заметку! На большинстве клавиатур символ ' находится на клавише, расположенной над клавишей <ТаЬ> (и слева от клавиши <1>).
Например, предположим, что требуется создать переменную List<T>, где Т — тип System.Int32. В C# пришлось бы написать такой код:
void SomeMethod()
{
List<int> myInts = new List<int>();
}
В CIL необходимо поступить следующим образом (этот код может находиться внутри любого метода CIL):
// В C#: List<int> myInts = new List<int>();
newobj instance void class [System.Collections]
System.Collections.Generic.List`1<int32>::.ctor()
Обратите внимание, что обобщенный класс определен как List'1<int32>, поскольку List<T> имеет единственный параметр типа. А вот как определить тип Dictionary<string,int>:
// В C#: Dictionary<string, int> d = new Dictionary<string, int>();
newobj instance void class [System.Collections]
System.Collections.Generic.Dictionary`2<string,int32>
::.ctor()
Рассмотрим еще один пример: пусть имеется обобщенный тип, использующий в качестве параметра типа другой обобщенный тип. Код CIL выглядит следующим образом:
// В C#: List<List<int>> myInts = new List<List<int>>();
newobj instance void class [mscorlib]
System.Collections.Generic.List`1<class
[System.Collections]
System.Collections.Generic.List`1<int32>>
::.ctor()
Компиляция файла CILTypes.il
Несмотря на то что к определенным ранее типам пока не были добавлены члены или код реализации, вы можете скомпилировать файл *.il в DLL-сборку .NET Core (так и нужно поступать ввиду отсутствия метода Main()). Откройте окно командной строки и введите показанную ниже команду:
dotnet build
Затем можете открыть скомпилированную сборку в ildasm.exe, чтобы удостовериться в создании каждого типа. Чтобы понять, каким образом заполнить тип содержимым, сначала необходимо ознакомиться с фундаментальными типами данных CIL.
Соответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL
В табл. 19.3 показано, как базовые классы .NET Core отображаются на соответствующие ключевые слова С#, а ключевые слова C# — на их представления в CIL. Кроме того, для каждого типа CIL приведено сокращенное константное обозначение. Как вы вскоре увидите, на такие константы часто ссылаются многие коды операций CIL.

На заметку! Типы System.IntPtr и System.UIntPtr отображаются на собственные типы int и unsigned int в CIL (это полезно знать, т.к. они интенсивно применяются во многих сценариях взаимодействия с СОМ и P/Invoke).
Определение членов типов в CIL
Как вам уже известно, типы .NET Core могут поддерживать разнообразные члены. Перечисления содержат набор пар "имя-значение". Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предшествующих восемнадцати главах книги вы уже видели частичные определения в CIL упомянутых элементов, но давайте еще раз кратко повторим, каким образом различные
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова