Speak.Me Учить иностранные слова

C#: типы данных

Тип — это некая общая схема значения (данных). Переменная — участок памяти, который может содержать разные значения (в отличие от константы, которая может содержать только одно значение). Диапазон возможных значений переменной определяется ее типом.

Предопределенные типы (Predefined types, built-in types)

Предопределенные типы — типы, непосредственно поддерживаемые компилятором. Предопределенные типы в C# включают:

  • Значимые типы (Value types)
    • Числовые (Numeric)
      • Целые числа со знаком (Signed integer): sbyte, short, int, long
      • Целые числа бес знака (Unsigned integer): byte, ushort, uint, ulong
      • Реальные числа (Real number): float, double, decimal
    • Логически тип (Logical): bool
    • Символьные типы (Character): char
  • Ссылочные типы (Reference types)
    • Строки (String): string
    • Объекты (Object): object

Предопределенные типы имеют псевдонимы в фреймворке в пространстве имен System. Предопределенные типы, за исключением типа decimal, в CLR (Common Language Runtime — общеязыковая исполняющая среда) называются простыми типами (primitive types), т.к. они поддерживаются инструкциями на уровне процессора.

Пользовательские типы (Custom types)

Пользовательские типы — типы, введенные разработчиком приложения (классы).

Типы содержат члены-данные, поля (data members, fields) и члены-функции, методы (function members).

Создание экземпляра типа (instantiation) и конструкторы (сonstructors). Данные создаются путем создания экземпляра (instantiating) типа. Экземпляры предопределенных типов создаются непосредственно с помощью литералов (12, "Hellow world"). Экземпляры пользовательских типов создаются с помощью оператора new. Сразу после того как оператор new создает объект, запускается конструктор объекта и происходит инициализация (initialization). Конструктор — это обычный метод, за исключением того, что его имя и возвращаемый тип совпадают с именем создаваемого типа.

Члены экземпляра (instance members) и статические члены (static members). Члены типа, которые взаимодействуют с экземпляром типа, называются членами экземпляра (instance member). По умолчанию, члены являются именно членами экземпляра. Члены типа, которые взаимодействуют не с экземпляром типа, а скорее с самим типом, должны быть отмечены как статичные (static). Если класс (тип) содержит только статичные члены он является статичным классом; экземпляр такого класса создать нельзя.

Преобразование типов (сonversion)

Совместимые типы могут быть преобразованы друг в друга. При этом всегда создается новое значение из уже существующего. Преобразование может быть скрытым (implicit) и явным (explicit). Скрытое преобразование происходит автоматически, тогда как явное требует явного приведения к типу (cast). Скрытое преобразование возможно только когда компилятор может гарантировать, что не произойдет потери данных. В противном случае необходимо явное приведение к типу.

Значимые типы (Value Types) и ссылочные типы (Reference Types)

Типы в C# делятся на значимые типы и ссылочные типы. Значимые типы включают большинство предопределенных (built-in) типов, а именно: все числовые типы (numeric), тип char (символьный, character), тип bool (логический, boolean), а так же пользовательские struct (структуры) и enum (перечисления) типы. Ссылочные типы включают все классы (class), массивы (array), делегаты (delegate) и интерфейсы (interface).

Ключевое отличие между значимыми типами и ссылочными типами в том, как они хранятся в памяти. Содержимое переменной или константы одного из значимых типов — это просто значение. При присвоении (assignment) экземпляра значимого типа экземпляр всегда копируется. Ссылочный тип более сложный: он состоит из двух частей — объект (object) и ссылка (reference) на этот объект. Содержимым переменной или константы ссылочного типа является ссылка на объект, который в свою очередь содержит значение. При присвоении переменной ссылочного типа копируется ссылка, но не сам объект. Это делает возможным нескольким переменным ссылаться на один и тот же объект, для значимых типов такое не возможно.

Ссылочной переменной может быть присвоен литерал null, что будет означать, что ссылка не указывает на объект. Попытка доступа к членам несуществующего объекта вызовет ошибку времени исполнения (runtime error). Значимы типы не могут иметь в качестве значения null (несуществующее значение), а попытка такого присвоения вызовет ошибку времени компиляции (compile-time error).