Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Соответствие между типами библиотеки базовых классов .Net, c# и cil

В табл. 15.4 показано соответствие между типами базовых классов .NET и ключевыми словами C#, а также между ключевыми словами C# и командами CIL. Там же представлены сокращенные обозначения констант, используемые для CIL-типов. Чуть позже вы сможете убедиться в том, что при использовании кодов операций C#, часто используются и ссылки на эти константы.

Определение членов типов в cil

Вы уже знаете, что типы .NET могут определить различные члены. Перечни содержат некоторый набор пар имен и значений. Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предыдущих 14 главах вы уже могли видеть фрагменты определений CIL для таких элементов, но тем не менее, ниже предлагается краткая сводка того, как различные члены отображаются в примитивы CIL.

Таблица 15.4. Связь между типами базовых классов .NET и ключевыми словами C#, а также их проекция в CIL

Тип базового класса .NET

Ключевое слово C#

Представление CIL

Обозначение для константы CIL

System.SByte

sbyte

int8

I1

System.Byte

byte

unsigned int8

U1

System.Int16

short

int16

I2

System.UInt16

ushort

unsigned int16

U2

System.Int32

int

int32

I4

System.UInt32

uint unsigned

int32

U4

System.Int64

long

int64

I8

System.UInt64

ulong

unsigned int64

U8

System.Char

char

char

CHAR

System.Single

float

float32

R4

System.Double

double

float64

R8

System.Boolean

bool

bool

BOOLEAN

System.String

string

string

System.Object

object

object

System.Void

void

void

VOID

Определение полей данных

Перечни, структуры и классы могут поддерживать поля данных. Во всех случаях для указания таких полей используется директива. field. Например, чтобы добавить немного сути в каркас MyEnum, давайте определим для него три пары имен и значений (заметьте, что значения здесь указываются в скобках).

.class public auto ansi sealed MyEnum extends [mscorlib]System.Enum {

 .field public static literal valuetype MyNamespace.MyEnum NameOne = int32(0)

 .field public static literal valuetype MyNamespace.MyEnum NameTwo = int32(1)

 .field public static literal valuetype MyNamespace.MyEnum NameThree = int32(2)

}

Поля, размещаемые в рамках контекста типа .NET, производного от System.Enum, сопровождаются атрибутами static и literal. Вам должно быть ясно, что эти атрибуты соответствуют полям данных, имеющим фиксированное значение и доступным из данного типа непосредственно (например, с помощью MyEnum.NameOne).

Замечание. Значения, присваиваемые полям перечня, могут также быть шестнадцатиричными.

Конечно, при определении полей данных в пределах класса или структуры вы не ограничены использованием только открытых статических литералов. Можно, например, добавить в MyBaseClass поддержку двух приватных полей данных уровня экземпляра.

.class public MyBaseClass {

 .field private string stringField

 .field private int32 intField

}

Как и в C#, полям данных класса будут автоматически назначены подходящие значения для непользовании по умолчанию. Чтобы позволить пользователю объекта указать во время создания объекта пользовательские значения для приватных полей данных, придется (конечно) создать пользовательские конструкторы.