Система общего типа
![]() | Эта статья может быть слишком технической для понимания большинства читателей . ( Август 2009 г. ) |
В Microsoft .NET Framework система общих типов ( CTS ) — это стандарт, который определяет, как определения типов и конкретные значения типов представлены в память компьютера. Он предназначен для того, чтобы позволить программам, написанным на разных языках программирования, легко обмениваться информацией. При использовании в языках программирования тип . можно описать как определение набора значений (например, «все целые числа от 0 до 10») и допустимых операций над этими значениями (например, сложение и вычитание)
Спецификация CTS содержится в стандарте Ecma 335 «Разделы общеязыковой инфраструктуры (CLI) от I до VI». CLI платформа и CTS были созданы Microsoft, а Microsoft .NET является реализацией стандарта.
Функции системы общего типа
[ редактировать ]- Создать структуру, которая поможет обеспечить межъязыковую интеграцию, безопасность типов и высокопроизводительное выполнение кода.
- Предоставить объектно-ориентированную модель, поддерживающую полную реализацию многих языков программирования.
- Определить правила, которым должны следовать языки, что помогает гарантировать, что объекты, написанные на разных языках, могут взаимодействовать друг с другом.
- CTS также определяет правила, которые гарантируют, что типы данных объектов, написанных на разных языках, смогут взаимодействовать друг с другом.
- CTS также определяет правила видимости типа и доступа к членам типа, т. е. CTS устанавливает правила, по которым сборки формируют область действия типа, а среда Common Language Runtime обеспечивает соблюдение правил видимости.
- CTS определяет правила, управляющие наследованием типов , виртуальными методами и временем жизни объектов.
- Языки, поддерживаемые .NET, могут реализовывать все или некоторые общие типы данных…
При округлении дробных значений по умолчанию во всей платформе используется метод «половина к четному» («банкирский»). Начиная с версии 2, по опции программиста также доступно «Симметричное арифметическое округление» (округление пополам от нуля). [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("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test
Вывод приведенного выше примера
Values: 0, 123 Refs: 123, 123
Упаковка и распаковка
[ редактировать ]Бокс
[ редактировать ]Преобразование типов значений в ссылочные типы также известно как бокс . Как видно из примера ниже, нет необходимости сообщать компилятору, что Int32 упакован в объект, поскольку он сам позаботится об этом.
Int32 x = 10;
object o = x ; // Implicit boxing
Console.WriteLine("The Object o = {0}",o); // prints out "The Object o = 10"
Однако Int32 всегда можно явно упаковать следующим образом:
Int32 x = 10;
object o = (object) x; // Explicit boxing
Console.WriteLine("The object o = {0}",o); // prints out "The object o = 10"
Распаковка
[ редактировать ]В следующем примере показано, как распаковать ссылочный тип обратно в тип значения. Сначала Int32 упаковывается в объект, а затем снова распаковывается. Обратите внимание, что распаковка требует явного приведения.
Int32 x = 5;
object o1 = x; // Implicit Boxing
x = (int)o1; // Explicit Unboxing