Введение
Язык программирования C# известен своей строгой статической типизацией. Это означает, что тип каждой переменной известен во время компиляции, что повышает безопасность и производительность кода. Система типов C# является одной из ключевых особенностей языка, обеспечивающих надежность и эффективность программ на C#.
Что такое Тип?
В мире C#, "тип" – это основной строительный блок, определяющий характеристики данных и то, как можно с ними работать. Типы в C# можно разделить на несколько категорий:
- Структурные типы: Числовые типы,
bool
, пользовательские структуры и т.д. - Ссылочные типы: Классы, массивы, делегаты, интерфейсы и т.д.
- Типы значений: Все структуры, включая примитивные типы (например,
int
,double
), а также перечисления (enum
).
Типы значений и ссылочные типы
Типы значений
Типы значений хранятся там, где они были объявлены. Например, если переменная типа значения объявлена в методе, она будет храниться в стеке. Примеры: int
, char
, bool
и структуры.
int number = 123;
bool isActive = true;
Ссылочные типы
Ссылочные типы хранят данные в куче, а переменная ссылочного типа в стеке хранит только ссылку на соответствующий объект в куче. Примеры: строки (string
), массивы (int[]
), классы (class MyClass {}
).
string name = "Alice";
int[] numbers = new int[5];
Nullability (способность быть null
)
- Типы значений: По умолчанию не могут быть
null
. - Ссылочные типы: Могут быть
null
.
Неявное и явное преобразование типов
- Неявное преобразование: Автоматическое преобразование из "меньшего" типа в "больший" (например, из
int
вlong
). - Явное преобразование: Требуется явное указание типа для преобразования (например, из
double
вint
).
int myInt = 123;
long myLong = myInt; // Неявное преобразование
double myDouble = 123.4;
int anotherInt = (int)myDouble; // Явное преобразование
Боксинг и анбоксинг
- Боксинг: Процесс преобразования типа значения в тип
object
или любой другой тип интерфейса, реализованный этим типом значения. - Анбоксинг: Обратный процесс — извлечение типа значения из объекта.
int i = 123;
object o = i; // Боксинг
int j = (int)o; // Анбоксинг
Обобщения (Generics)
Обобщения позволяют определить классы, интерфейсы, делегаты и методы с "заполнителями" для типов, которые указываются позже, при создании экземпляра или вызове метода. Это обеспечивает типобезопасность и повышает гибкость и переиспользование кода.
List<int> numbers = new List<int>();
numbers.Add(1); // Добавляем число в список
Динамические типы
В C# есть также ключевое слово dynamic
, которое позволяет обходить статическую проверку типов во время компиляции. Операции с динамическими типами проверяются только во время выполнения.
dynamic d = 1;
d = d + 3; // Работает, потому что во время выполнения `d` является int
d = "Hello";
d = d + " World"; // Работает, потому что теперь `d` — это string
Перечисления (enum)
Перечисления — это специальный тип данных в C#, позволяющий определить набор именованных констант. Обычно используется для представления группы связанных значений.
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
Таблица основных типов
Тип | Описание | Примеры |
---|---|---|
int |
32-битное целое число | 123, -456 |
long |
64-битное целое число | 123456789L |
float |
32-битное число с плавающей точкой | 123.45F |
double |
64-битное число с плавающей точкой | 123.456 |
decimal |
128-битное десятичное число | 123.456M |
char |
16-битный символ Unicode | 'A', '4', '∞' |
string |
Последовательность символов Unicode | "Hello, World!" |
bool |
Логическое значение | true, false |
DateTime |
Дата и время | DateTime.Now |
enum |
Перечисление | Days.Mon |
object |
Базовый тип всех других типов | любой объект |