В .NET Framework компании Microsoft система общих типов ( CTS ) — это стандарт, который определяет, как определения типов и конкретные значения типов представлены в памяти компьютера. Он предназначен для того, чтобы программы, написанные на разных языках программирования, могли легко обмениваться информацией. При использовании в языках программирования тип можно описать как определение набора значений (например, «все целые числа от 0 до 10») и допустимых операций над этими значениями (например, сложение и вычитание).
Спецификация CTS содержится в стандарте Ecma 335, «Common Language Infrastructure (CLI) Partitions I to VI». CLI и CTS были созданы корпорацией Microsoft, а фреймворк Microsoft .NET является реализацией стандарта.
При округлении дробных значений по умолчанию во всей Framework используется метод « полу-к-четному » («банковский»). Начиная с версии 2, по желанию программиста также доступно «симметричное арифметическое округление» (округление до половины от нуля). [1]
Общая система типов поддерживает две общие категории типов:
Следующий пример, написанный на Visual Basic .NET, демонстрирует разницу между ссылочными типами и типами значений:
Система импорта 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
Преобразование типов значений в ссылочные типы также известно как упаковка . Как видно из примера ниже, нет необходимости сообщать компилятору, что Int32 упакован в объект, поскольку он сам позаботится об этом.
Int32 x = 10 ; object o = x ; // Неявная упаковка Console . WriteLine ( "Объект o = {0}" , o ); // выводит "Объект o = 10"
Однако Int32 всегда можно явно упаковать следующим образом:
Int32 x = 10 ; object o = ( object ) x ; // Явная упаковка Console . WriteLine ( "Объект o = {0}" , o ); // выводит "Объект o = 10"
Следующий пример показывает, как распаковать ссылочный тип обратно в тип значения. Сначала Int32 упаковывается в объект, а затем снова распаковывается. Обратите внимание, что распаковка требует явного приведения.
Int32 x = 5 ; object o1 = x ; // Неявная упаковка x = ( int ) o1 ; // Явная распаковка