Содержание
Тип данных определяет то, каким образом будет представлена та или иная сущность (переменная) в приложении, какие значения она может принимать и какие действия над ней можно производить. Существует несколько способов по которым мы можем сгруппировать различные типы данных. В C# все типы данных подразделяются на две большие группы — ссылочные типы и типы значений. Соответственно, переменная типа значений хранит непосредственно данные, а переменная ссылочного типа, как следует из названия, ссылку на данные, которые именуются каким-либо объектом.
Схема типов данных в C#
Опираясь на официальную документацию по языку C#, все типы данных в C# можно представить следующей схемой:
Попробуем разобраться с каждой группой типов данных в C# по отдельности.
Типы значений
Простые (встроенные) типы данных.
Целочисленные типы
Язык C# предоставляет разработчику восемь различных целочисленных типов данных, представленных в таблице ниже:
Тип | Разрядность в битах | Значения |
sbyte |
8 | От -128 до 127 |
byte |
8 | От 0 до 255 |
short |
16 | От -32 768 до 32 767 |
ushort |
16 | От 0 до 65 535 |
int |
32 | От -2 147 483 648 до 2 147 483 647 |
uint |
32 | От 0 до 4 294 967 295 |
long |
64 | От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
ulong |
64 | От 0 до 18 446 744 073 709 551 615 |
Когда мы рассматривали тему литералов в C#, было показано также как переводить целочисленные значения в различные формы (двоичную, шестнадцатеричную и так далее). Как было сказано выше, от того, какой тип данных мы присвоим переменной зависит то, какой диапазон значений она может принимать. Например, вот такой код вызовет ошибку:
byte i = 300;
так как тип переменная типа byte
может принимать значения только от 0
до 255
.
Типы с плавающей запятой
Что касается типов данных с плавающей запятой (или точкой — кому как удобнее), то на данный момент в C# представлено всего три таких типа:
Тип | Разрядность в битах | Значения | Точность, цифр |
float |
4 | От ±1,5 x 10−45 до ±3,4 x 1038 | 6–9 |
double |
8 | от ±5,0 × 10−324 до ±1,7 × 10308 | 15–17 |
decimal |
16 | от ±1,0 x 10-28 до ±7,9228 x 1028 | 28-29 |
Логический тип
Логический тип bool
в C# используется для представления логических значений, которые могут иметь значение true
(истина) или false
(ложь). Например,
bool no = false; bool yes = true;
Символ (Char)
Обработка знаков и строк в C# выполняется в кодировке Unicode. Тип char
представляет элемент в кодировке UTF-16, а тип string
представляет последовательность элементов в кодировке UTF-16. Например,
char ch = 'a';
Обратите внимание, что значение переменной типа char заключается в одинарные кавычки.
Перечисления
Тип перечисление определяется в C# следующим образом:
enum Season { Spring, Summer, Autumn, Winter }
По умолчанию порядковые номера перечисляемых значений начинаются с нуля и следуют последовательности, в которой их идентификаторы перечислены в объявлении типа. Мы можем переопределить порядковые номера некоторым или всем значениям в объявлении, например, так:
enum Colors { Red = 5, Green, Blue };
Теперь порядковые номера у элементов Colors
будут следующие: Red = 5, Green = 6, Blue = 7
. В перечислениях C# можно переопределять тип связанных значений констант элементов перечисления. Так, по умолчанию тип связанных значений констант имеет тип int
, однако мы можем переопределить тип следующим образом:
enum ErrorCode : ushort { None = 0, Unknown = 1, ConnectionLost = 100, OutlierReading = 200 }
Подробнее о перечислениях можно узнать в справке Microsoft или в этой части.
Структуры
Структуры в C# можно отнести к пользовательским типа данных. Такие типы данных используются для определения каких-либо сложных сущностей, позволяя объединять свойства этих сущностей в виде отдельно целостной структуры данных. Например, вот так мы можем описать координаты точки, используя структуры:
public struct Coords { public Coords(double x, double y) { X = x; Y = y; } public double X; public double Y; }
Теперь, чтобы воспользоваться структурой и вывести на экран координаты точки, мы можем написать вот такой код:
Coords Point; Point.X = 100; Point.Y = 200; System.Console.WriteLine(Point.X+" "+Point.Y);
Подробнее о структурах можно узнать в справке Microsoft или в этий статье учебника по C#.
Кортежи
Тип кортежей появился в C# 7.0. Кортежи — это упрощенные структуры данных, содержащие несколько полей для представления элементов данных. Поля не проверяются, и собственные методы определять нельзя. Об этом типе данных поговорим позднее, когда начнем разбираться с конкретными примерами работы в C#.
Подробнее о кортежах — см. справку Microsoft.
Ссылочные типы
К ссылочным типам в C# относят: классы, интерфейсы, массивы и делегаты.
Классы
Тип class
— пользовательский тип данных, который определяет структуру данных, которая содержит данные-члены (поля) и функции-члены (методы, свойства и т. д.).
С классами мы уже имели дело, когда писали свое первое приложение в Visual Studio. Пример определения класса в C#:
class Program { static void Main(string[] args) { Console.WriteLine("Hello, world!"); } }
Классы поддерживают механизмы одиночного наследования и полиморфизма. К классам в C#, в соответствии с официальной документацией, отнесены также и строки (string
). Почему — узнаем чуть позднее, когда будем рассматривать работу со строками в C#.
Подробнее о классах в справке Microsoft.
Интерфейсы
Тип interface
(интерфейс) определяет контракт в виде именованного набора открытых функций-членов. Объект типа class
или struct
, реализующий interface
, должен предоставить реализации для всех функций-членов интерфейса.
Тип interface
может наследовать от нескольких базовых интерфейсов, а class
или struct
могут реализовывать несколько интерфейсов.
Подробнее об интерфейсах C# в справке Microsoft или в этой статье.
Массивы
Массив — это набор однотипных переменных. Определить массив можно следующим образом:
//объявляем массив из трех чисел int[] MyArray = new int[3]; //задаем значения элементов массива MyArray[0] = 10; MyArray[1] = 20; MyArray[2] = 30;</pre>
Про массивы и работу с ними мы также поговорим позднее. Подробнее о массивах C# — см. справку Microsoft.
Делегаты
Тип delegate
(делегат) представляющий ссылки на методы с конкретным списком параметров и типом возвращаемого значения. Делегаты позволяют использовать методы как сущности, сохраняя их переменные и передавая в качестве параметров.
Делегаты аналогичны типам функций, которые используются в функциональных языках. Их принцип работы близок к указателям функций из некоторых языков.
В отличие от указателей функций, делегаты являются объектно-ориентированными и типобезопасными.
Подробнее о делегатах C# — см. справку Microsoft или эту статью.
Итого
Сегодня мы рассмотрели структуру типов данных в C#. Узнали, что из себя представляют ссылочные типы данных и типы значений. Конечно, представленной выше информации недостаточно, чтобы детально погрузиться в особенности каждого типа, вопросы его использования в программах и так далее, но эта информация может служить нам своеобразным словарем к которому мы будем периодически обращаться при детальном изучении того или иного типа данных C#.