Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
}
Как и в С#, поля данных класса будут автоматически инициализироваться подходящими стандартными значениями. Чтобы предоставить пользователю объекта возможность указывать собственные значения во время создания закрытых полей данных, потребуется создать специальные конструкторы.
Определение конструкторов типа в CIL
Спецификация CTS поддерживает создание конструкторов как уровня экземпляра, так и уровня класса (статических). В CIL конструкторы уровня экземпляра представляются с использованием лексемы
.ctor
.cctor
rtspecialname
specialname
void
.class public MyBaseClass
{
.field private string stringField
.field private int32 intField
.method public hidebysig specialname rtspecialname
instance void .ctor(string s, int32 i) cil managed
{
<b> // Добавить код реализации...</b>
}
}
Обратите внимание, что директива
.ctor
instance
cil managed
Определение свойств в CIL
Свойства и методы также имеют специфические представления в CIL. В качестве примера модифицируйте класс
MyBaseClass
TheString
specialname
.class public MyBaseClass
{
...
.method public hidebysig specialname
instance string get_TheString() cil managed
{
<b> // Добавить код реализации...</b>
}
.method public hidebysig specialname
instance void set_TheString(string 'value') cil managed
{
<b> // Добавить код реализации...</b>
}
.property instance string TheString()
{
.get instance string
MyNamespace.MyBaseClass::get_TheString()
.set instance void
MyNamespace.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
int32
public static void MyMethod(int inputInt,
ref int refInt, ArrayList ar, out int outputInt)
{
outputInt = 0; // Просто чтобы удовлетворить компилятор C#...
}
После отображения метода
MyMethod()
&
int32 &
Выходные параметры также снабжаются суффиксом
&
[out]
[System.RuntimeExtensions]System.Collections.ArrayList
class
.class
.method public hidebysig static void MyMethod(int32 inputInt,