Содержание
Тип — это некая общая схема значения (данных). Переменная — участок памяти, который может содержать разные значения (в отличие от константы, которая может содержать только одно значение). Диапазон возможных значений переменной определяется ее типом.
Предопределенные типы (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
- Целые числа со знаком (Signed integer):
- Логически тип (Logical):
bool
- Символьные типы (Character):
char
- Числовые (Numeric)
- Ссылочные типы (Reference types)
- Строки (String):
string
- Объекты (Object):
object
- Строки (String):
Предопределенные типы имеют псевдонимы в фреймворке в пространстве имен 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). Скрытое преобразование возможно только когда компилятор может гарантировать, что не произойдет потери данных. В противном случае необходимо явное приведение к типу.
1 2 3 | int x = 12345; // int - 32-битное число long y = x; // Скрытое преобразование к 64-битному числу short z = (short)x; // Явное преобразование к 16-битному числу |
Значимые типы (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).