Открыть сервис

Common Type System

Common Type System (CTS, общая система типов) — стандартизированная спецификация в составе платформы .NET Framework, определяющая правила объявления, использования и управления типами данных в среде выполнения Common Language Runtime (CLR). CTS разработана корпорацией Microsoft и впервые представлена в 2002 году вместе с платформой .NET; с 2005 года её ключевые положения закреплены в международном стандарте ECMA-335 (Common Language Infrastructure, CLI). CTS обеспечивает межъязыковую совместимость: типы, созданные на одном языке программирования (например, C#), могут корректно использоваться в другом (например, Visual Basic .NET или F#), поскольку все они компилируются в единый промежуточный язык CIL и подчиняются общим правилам.

Основные принципы

CTS базируется на двух фундаментальных понятиях — типах и членах типов. Тип описывает структуру данных и допустимые операции над ними; член — компонент типа (поле, метод, свойство, событие). Спецификация определяет:

  • правила именования типов и их членов (регистрозависимость, запрет некоторых символов);
  • правила видимости и доступа (public, private, protected, internal и их комбинации);
  • правила наследования и реализации интерфейсов (одиночное наследование классов, множественная реализация интерфейсов);
  • правила перегрузки методов и операторов;
  • правила управления временем жизни объектов (сборка мусора, финализация);
  • правила обработки исключений.

CTS гарантирует, что любой тип, удовлетворяющий её требованиям, может быть использован любым языком, поддерживаемым .NET, без дополнительных преобразований.

Классификация типов

CTS разделяет все типы на две основные категории: ссылочные типы (reference types) и типы-значения (value types).

Ссылочные типы

Переменная ссылочного типа хранит адрес объекта в управляемой куче. При присваивании копируется ссылка, а не сам объект. К ссылочным типам относятся:

  • классы (class) — произвольные пользовательские типы;
  • интерфейсы (interface) — контракты, определяющие набор членов без реализации;
  • массивы (array) — упорядоченные коллекции элементов одного типа;
  • делегаты (delegate) — типобезопасные указатели на методы;
  • строки (string) — неизменяемые последовательности символов.

Типы-значения

Переменная типа-значения хранит непосредственно данные. При присваивании копируется значение целиком. К ним относятся:

  • примитивные числовые типы (byte, short, int, long, float, double, decimal);
  • логический тип bool;
  • символьный тип char;
  • структуры (struct) — пользовательские типы-значения;
  • перечисления (enum) — набор именованных целочисленных констант.

Типы-значения не размещаются в куче и не собираются сборщиком мусора, что повышает производительность, но ограничивает их использование в некоторых сценариях (например, при наследовании).

Встроенные типы

CTS определяет фиксированный набор встроенных типов, которым в каждом языке сопоставлены собственные ключевые слова. Например, тип System.Int32 в C# обозначается как int, в Visual Basic — как Integer. Все встроенные типы являются структурами или классами из пространства имён System. Ключевые встроенные типы:

Тип CTSКласс .NETДиапазон значений
byteSystem.Byte0–255
shortSystem.Int16−32 768 – 32 767
intSystem.Int32−2 147 483 648 – 2 147 483 647
longSystem.Int64−9 223 372 036 854 775 808 – 9 223 372 036 854 775 807
floatSystem.Single±1,5×10⁻⁴⁵ – ±3,4×10³⁸
doubleSystem.Double±5,0×10⁻³²⁴ – ±1,7×10³⁰⁸
decimalSystem.Decimal±1,0×10⁻²⁸ – ±7,9×10²⁸
boolSystem.Booleantrue / false
charSystem.Char0–65 535 (UTF-16)

Тип string (System.String) является ссылочным, но ведёт себя как неизменяемый тип-значение: любые операции «изменения» строки создают новый объект.

Связь с CLR и языками программирования

CTS — один из трёх компонентов спецификации CLI, наряду с Common Language Specification (CLS) и Virtual Execution System (VES). Если CTS описывает полный набор типов и правил, то CLS определяет подмножество CTS, обязательное для межъязыковой совместимости. Разработчики библиотек, ориентированных на использование из любого .NET-языка, должны ограничиваться только CLS-совместимыми конструкциями.

Среда CLR реализует CTS на практике: при компиляции исходного кода в CIL все типы приводятся к CTS-представлению, а при выполнении JIT-компилятор транслирует CIL в машинный код с учётом CTS-правил. Это позволяет смешивать код на разных языках в одном приложении: например, класс на C# может наследоваться от класса на Visual Basic и реализовывать интерфейс на F#.

Значение и ограничения

CTS стала основой типобезопасности .NET: благодаря строгой системе типов исключаются целые классы ошибок (например, переполнение буфера при неявном приведении). Она также обеспечивает унифицированную модель исключений, сборки мусора и рефлексии (динамического анализа типов). Критики отмечают сложность CTS для начинающих из-за различий между типами-значениями и ссылочными типами, а также накладные расходы на упаковку (boxing) — преобразование типа-значения в ссылочный. В более новых версиях (начиная с .NET Core 2.0 и .NET 5+) CTS сохранилась в неизменном виде, хотя платформа стала кроссплатформенной и открытой.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →