Язык программирования C#9 и платформа .NET5
}Как и в С#, поля данных класса будут автоматически инициализироваться подходящими стандартными значениями. Чтобы предоставить пользователю объекта возможность указывать собственные значения во время создания закрытых полей данных, потребуется создать специальные конструкторы.
Определение конструкторов типа в CIL
Спецификация CTS поддерживает создание конструкторов как уровня экземпляра, так и уровня класса (статических). В CIL конструкторы уровня экземпляра представляются с использованием лексемы
, тогда как конструкторы уровня класса — посредством лексемы.ctor(class constructor — конструктор класса). Обе лексемы CIL должны сопровождаться атрибутами.cctor(return type special name — специальное имя возвращаемого типа) иrtspecialname. Упомянутые атрибуты применяются для обозначения специфической лексемы CIL, которая может трактоваться уникальным образом в любом отдельно взятом языке .NET Core. Например, в языке C# конструкторы не определяют возвращаемый тип, но в CIL возвращаемым значением конструктора на самом деле являетсяspecialname:void.class public MyBaseClass{.field private string stringField.field private int32 intField.method public hidebysig specialname rtspecialnameinstance void .ctor(string s, int32 i) cil managed{<b> // Добавить код реализации...</b>}}Обратите внимание, что директива
снабжена атрибутом.ctor(поскольку конструктор не статический). Атрибутыinstanceуказывают на то, что внутри данного метода содержится код CIL, а не неуправляемый код, который может использоваться при выполнении запросов Р/Invoke.cil managedОпределение свойств в CIL
Свойства и методы также имеют специфические представления в CIL. В качестве примера модифицируйте класс
с целью поддержки открытого свойства по имениMyBaseClass, написав следующий код CIL (обратите внимание на применение атрибутаTheString):specialname.class public MyBaseClass{....method public hidebysig specialnameinstance string get_TheString() cil managed{<b> // Добавить код реализации...</b>}.method public hidebysig specialnameinstance void set_TheString(string 'value') cil managed{<b> // Добавить код реализации...</b>}.property instance string TheString(){.get instance stringMyNamespace.MyBaseClass::get_TheString().set instance voidMyNamespace.MyBaseClass::set_TheString(string)}}В терминах CIL свойство отображается на пару методов, имеющих префиксы
иget_. В директивеset_используются связанные директивы.propertyи.getдля отображения синтаксиса свойств на подходящие "специально именованные" методы..setНа заметку! Обратите внимание, что входной параметр метода
в свойстве помещен в одинарные кавычки и представляет имя лексемы, которая должна применяться в правой части операции присваивания внутри области определения метода.setОпределение параметров членов
Коротко говоря, параметры в CIL указываются (более или менее) идентично тому, как это делается в С#. Например, каждый параметр определяется путем указания его типа данных, за которым следует имя параметра. Более того, подобно C# язык CIL позволяет определять входные, выходные и передаваемые по ссылке параметры. Вдобавок в CIL допускается определять массив параметров (соответствует ключевому слову
в С#), а также необязательные параметры.paramsЧтобы проиллюстрировать процесс определения параметров в низкоуровневом коде CIL, предположим, что необходимо построить метод, который принимает параметр
(по значению), параметрint32(по ссылке), параметрint32и один выходной параметр (типа[System.Runtime.Extensions]System.Collection.ArrayList). В C# метод выглядел бы примерно так:int32public static void MyMethod(int inputInt,ref int refInt, ArrayList ar, out int outputInt){outputInt = 0; // Просто чтобы удовлетворить компилятор C#...}После отображения метода
на код CIL вы обнаружите, что ссылочные параметры C# помечаются символом амперсанда (MyMethod()), который дополняет лежащий в основе тип данных (&).int32 &Выходные параметры также снабжаются суффиксом
, но дополнительно уточняются лексемой&языка CIL. Вдобавок если параметр относится к ссылочному типу ([out]), то перед типом данных указывается лексема[System.RuntimeExtensions]System.Collections.ArrayList(не путайте ее с директивойclass):.class.method public hidebysig static void MyMethod(int32 inputInt,