types

Система типов языка C#: Подробный разбор

Введение

Язык программирования 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 Базовый тип всех других типов любой объект
Читайте так же  For в C#: 6 примеров