Язык программирования C#9 и платформа .NET5
Шрифт:
Определение обобщений в CIL
Обобщенные типы также имеют собственное представление в синтаксисе CIL. Вспомните из главы 10, что обобщенный тип или член может иметь один и более параметров типа. Например, в типе
На заметку! На большинстве клавиатур символ
Например, предположим, что требуется создать переменную
В CIL необходимо поступить следующим образом (этот код может находиться внутри любого метода CIL):
Обратите внимание, что обобщенный класс определен как
Рассмотрим еще один пример: пусть имеется обобщенный тип, использующий в качестве параметра типа другой обобщенный тип. Код CIL выглядит следующим образом:
Компиляция файла CILTypes.il
Несмотря на то что к определенным ранее типам пока не были добавлены члены или код реализации, вы можете скомпилировать файл
Затем можете открыть скомпилированную сборку в
Соответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL
В табл. 19.3 показано, как базовые классы .NET Core отображаются на соответствующие ключевые слова
С#, а ключевые слова C# — на их представления в CIL. Кроме того, для каждого типа CIL приведено сокращенное константное обозначение. Как вы вскоре увидите, на такие константы часто ссылаются многие коды операций CIL.На заметку! Типы
Определение членов типов в CIL
Как вам уже известно, типы .NET Core могут поддерживать разнообразные члены. Перечисления содержат набор пар "имя-значение". Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предшествующих восемнадцати главах книги вы уже видели частичные определения в CIL упомянутых элементов, но давайте еще раз кратко повторим, каким образом различные члены отображаются на примитивы CIL.
Определение полей данных в CIL
Перечисления, структуры и классы могут поддерживать поля данных. Во всех случаях для их определения будет использоваться директива
Поля, находящиеся внутри области действия производного от
На заметку! Значения, присваиваемые полям в перечислении, также могут быть представлены в шестнадцатеричном формате с префиксом
Конечно, когда нужно определить элемент поля данных внутри класса или структуры, вы не ограничены только открытыми статическими литеральными данными. Например, класс
Как и в С#, поля данных класса будут автоматически инициализироваться подходящими стандартными значениями. Чтобы предоставить пользователю объекта возможность указывать собственные значения во время создания закрытых полей данных, потребуется создать специальные конструкторы.