Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 352
- Предыдущая
- 352/642
- Следующая
На заметку! На большинстве клавиатур символ
'Например, предположим, что требуется создать переменную
List<T>ТSystem.Int3void 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
Несмотря на то что к определенным ранее типам пока не были добавлены члены или код реализации, вы можете скомпилировать файл
*.ilMain()dotnet buildЗатем можете открыть скомпилированную сборку в
ildasm.exeСоответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL
В табл. 19.3 показано, как базовые классы .NET Core отображаются на соответствующие ключевые слова С#, а ключевые слова C# — на их представления в CIL. Кроме того, для каждого типа CIL приведено сокращенное константное обозначение. Как вы вскоре увидите, на такие константы часто ссылаются многие коды операций CIL.

На заметку! Типы
System.IntPtrSystem.UIntPtrintunsigned intОпределение членов типов в CIL
Как вам уже известно, типы .NET Core могут поддерживать разнообразные члены. Перечисления содержат набор пар "имя-значение". Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предшествующих восемнадцати главах книги вы уже видели частичные определения в CIL упомянутых элементов, но давайте еще раз кратко повторим, каким образом различные члены отображаются на примитивы CIL.
Определение полей данных в CIL
Перечисления, структуры и классы могут поддерживать поля данных. Во всех случаях для их определения будет использоваться директива
.fieldMyEnum.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.EnumstaticliteralMyEnum.АНа заметку! Значения, присваиваемые полям в перечислении, также могут быть представлены в шестнадцатеричном формате с префиксом
0хКонечно, когда нужно определить элемент поля данных внутри класса или структуры, вы не ограничены только открытыми статическими литеральными данными. Например, класс
MyBaseClass.class public MyBaseClass{ .field private string stringField = "hello!" .field private int32 intField = int32(42)- Предыдущая
- 352/642
- Следующая
