Метки: Common type system cts, common type system.
Common Type System (сокр. CTS, рус. Стандартная система типов) — часть .NET Framework, формальная спецификация, определяющая, как какой-либо тип (класс, интерфейс, структура, встроенный тип данных) должен быть определён для его правильного выполнения средой .NET. Кроме того, данный стандарт определяет, как определения типов и специальные значения типов представлены в компьютерной памяти. Целью разработки CTS было обеспечение возможности программам, написанным на различных языках программирования, легко обмениваться информацией. Как это принято в языках программирования, тип может быть описан как определение набора допустимых значений (например, «все целые от 0 до 10») и допустимых операций над этими значениями (например, сложение и вычитание).
Спецификация для CTS закреплена в стандарте Ecma 335, озаглавленном «Common Language Infrastructure (CLI) Partitions I to VI» (рус. Общеязыковая инфраструктура, главы с I по IV). The CLI и CTS были разработаны корпорацией Microsoft, а Microsoft .NET framework — реализация стандарта.
Содержание |
При округлении дробных значений благодаря фреймворку по умолчанию применяется метод банковского округления. Начиная с версии 2, «симметричное арифметическое округление» («англ. Symmetric Arithmetic Rounding») (округляет до ближайшего числа со стороны нуля) также доступно программистам в качестве дополнительной возможности[1].
Стандартная система типов поддерживает две основные категории типов:
Нижеследующий пример, написанный на языке Visual Basic .NET, демонстрирует различие между ссылочными типами и значимыми типами:
Imports System Class Class1 Public Value As Integer = 0 End Class 'Class1 Class Test Shared Sub Main() Dim val1 As Integer = 0 Dim val2 As Integer = val1 val2 = 123 Dim ref1 As New Class1() Dim ref2 As Class1 = ref1 ref2.Value = 123 Console.WriteLine("Значения: {0}, {1}", val1, val2) Console.WriteLine("Ссылки: {0}, {1}", ref1.Value, ref2.Value) End Sub 'Main End Class 'Test
Вышеприведенный пример выводит следующее:
Значения: 0, 123 Ссылки: 123, 123
Значение значемого типа может быть преобразовано в значение ссылочного типа путем применения к нему процедуры упаковки (боксинга, англ. boxing). При этом значение переносится в кучу, и возвращается управляемая ссылка на область кучи содержащую это значение. Как видно из примера приведенного ниже, в C# нет необходимости указывать компилятору, что необходимо упаковать Int32-значение, превратив его тем самым в объект, поскольку компилятор C# сам выявляет такую необходимость и вставляет соответствующий код (IL). Однако это не относится к возможностям среды выполнения, а является поведением компилятора. Так в языке F# упаковка производится только если программист явно указал ее необходимость.
Int32 x = 10; object o = x ; // Неявная упаковка Console.WriteLine("Объект o = {0}",o); // печатает 10
Однако, Int32 всегда может быть упакован явным образом, как показано ниже:
Int32 x = 10; object o = (object) x; // Явная упаковка Console.WriteLine("Объект o = {0}",o); // печатает 10
Процесс, обратный упаковке называется распаковкой (англ. unboxing). Нижеследующий пример демонстрирует как в языке C# распаковать запакованный до этого значимый тип.
Int32 x = 5; object o1 = x; // Неявная упаковка x = (int)o1; // Явная распаковка
Необходимо отметить, что в данном пример распаковка требует явного приведения типов. Это связано с тем, что запакованное значение имеет тип object, а распаковка требует указания конкретного типа. Начиная с C# 4.0 вместо типа object можно использовать тип dynamic, что позволяет обходиться без явного приведения типов.
dynamic x = 42; int y = x; // Неявная распаковка
Это заготовка статьи о программном обеспечении. Вы можете помочь проекту, исправив и дополнив её. |
Tags: Common type system cts, common type system.