Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На заметку! На большинстве клавиатур символ
'
Например, предположим, что требуется создать переменную
List<T>
Т
System.Int3
void SomeMethod()
{
List<int> myInts = new List<int>();
}
В CIL необходимо поступить следующим образом (этот код может находиться внутри любого метода CIL):
<b>// В C#: List<int> myInts = new List<int>();</b>
newobj instance void class [System.Collections]
System.Collections.Generic.List`1<int32>::.ctor()
Обратите внимание, что обобщенный класс определен как
List'1<int32>
List<T>
Dictionary<string,int>
<b>// В C#: Dictionary<string, int> d = new Dictionary<string, int>();</b>
newobj instance void class [System.Collections]
System.Collections.Generic.Dictionary`2<string,int32>
::.ctor()
Рассмотрим еще один пример: пусть имеется обобщенный тип, использующий в качестве параметра типа другой обобщенный тип. Код CIL выглядит следующим образом:
<b>// В C#: List<List<int>> myInts = new List<List<int>>();</b>
newobj instance void class [mscorlib]
System.Collections.Generic.List`1<class
[System.Collections]
System.Collections.Generic.List`1<int32>>
::.ctor()
Компиляция файла CILTypes.il
Несмотря на то что к определенным ранее типам пока не были добавлены члены или код реализации, вы можете скомпилировать файл
*.il
Main()
dotnet build
Затем можете открыть скомпилированную сборку в
ildasm.exe
Соответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL
В табл. 19.3 показано, как базовые классы .NET Core отображаются на соответствующие ключевые слова С#, а ключевые слова C# — на их представления в CIL. Кроме того, для каждого типа CIL приведено сокращенное константное обозначение. Как вы вскоре увидите, на такие константы часто ссылаются многие коды операций CIL.

На заметку! Типы
System.IntPtr
System.UIntPtr
int
unsigned int
Определение членов типов в CIL
Как вам уже известно, типы .NET Core могут поддерживать разнообразные члены. Перечисления содержат набор пар "имя-значение". Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предшествующих восемнадцати главах книги вы уже видели частичные определения в CIL упомянутых элементов, но давайте еще раз кратко повторим, каким образом различные члены отображаются на примитивы CIL.
Определение полей данных в CIL
Перечисления, структуры и классы могут поддерживать поля данных. Во всех случаях для их определения будет использоваться директива
.field
MyEnum
.class public sealed enum MyEnum
{
.field public static literal valuetype
MyNamespace.MyEnum A = int32(0)
.field public static literal valuetype
MyNamespace.MyEnum B = int32(1)
.field public static literal valuetype
MyNamespace.MyEnum C = int32(2)
}
Поля, находящиеся внутри области действия производного от
System.Enum
static
literal
MyEnum.А
На заметку! Значения, присваиваемые полям в перечислении, также могут быть представлены в шестнадцатеричном формате с префиксом
0х
Конечно, когда нужно определить элемент поля данных внутри класса или структуры, вы не ограничены только открытыми статическими литеральными данными. Например, класс
MyBaseClass
.class public MyBaseClass
{
.field private string stringField = "hello!"
.field private int32 intField = int32(42)