Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Классификации типов в C#
В C# существует несколько основных классификаций типов, которые основаны на различных критериях: способе определения, расположении в памяти, поведении при присваивании и наследовании. Понимание этих классификаций критически важно для написания эффективного и безопасного кода.
1. По способу определения
Встроенные (предопределенные) типы
Это базовые типы, предоставляемые языком C# и средой CLR:
- Целочисленные:
byte,sbyte,short,ushort,int,uint,long,ulong - С плавающей точкой:
float,double,decimal - Логический:
bool - Символьный:
char - Строковый:
string - Объектный:
object - Динамический:
dynamic
Пользовательские типы
Типы, определяемые разработчиком:
- Классы (class) - ссылочные типы, поддерживающие наследование
- Структуры (struct) - значимые типы, не поддерживающие наследование
- Перечисления (enum) - набор именованных констант
- Интерфейсы (interface) - контракты, определяющие поведение
- Делегаты (delegate) - типобезопасные указатели на методы
- Записи (record) - неизменяемые типы данных (появились в C# 9.0/10.0)
// Пример пользовательских типов
public class Person { } // Класс
public struct Point { } // Структура
public enum Status { Active, Inactive } // Перечисление
public interface IRepository { } // Интерфейс
public delegate void Callback(); // Делегат
public record Product(string Name, decimal Price); // Запись
2. По способу хранения в памяти
Значимые типы (Value Types)
- Хранятся в стеке (stack) или внутри других объектов
- Содержат непосредственно данные
- К ним относятся: структуры, перечисления и все встроенные числовые типы
- При присваивании создается копия значения
int a = 10;
int b = a; // Создается копия значения
b = 20; // a остается равным 10
Ссылочные типы (Reference Types)
- Хранятся в управляемой куче (managed heap)
- Содержат ссылку на область памяти с данными
- К ним относятся: классы, интерфейсы, делегаты, массивы, строки
- При присваивании копируется только ссылка
class MyClass { public int Value; }
MyClass obj1 = new MyClass { Value = 10 };
MyClass obj2 = obj1; // Копируется ссылка
obj2.Value = 20; // obj1.Value тоже становится 20
3. По допустимости значения null
Не допускающие null (Non-nullable)
- Не могут содержать значение
null - Для значимых типов это поведение по умолчанию
- В C# 8.0+ с включенным nullable context все ссылочные типы по умолчанию non-nullable
Допускающие null (Nullable)
- Могут содержать значение
null - Для значимых типов используется синтаксис
T? - Для ссылочных типов в nullable context требуется явное указание
?
int? nullableInt = null; // Nullable значимый тип
string? nullableString = null; // Nullable ссылочный тип
4. По изменяемости (Mutability)
Изменяемые типы (Mutable)
- Состояние объектов можно изменять после создания
- Большинство классов в .NET являются изменяемыми
public class MutablePerson
{
public string Name { get; set; } // Можно изменить
}
Неизменяемые типы (Immutable)
- Состояние объектов нельзя изменить после создания
string,record(по умолчанию),readonly struct
public readonly struct ImmutablePoint
{
public int X { get; }
public int Y { get; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
}
5. По поддержке обобщений (Generics)
Открытые типы (Open Types)
- Типы с незаполненными параметрами-типами
List<T>,Dictionary<TKey, TValue>
Закрытые типы (Closed Types)
- Типы с конкретными аргументами типа
List<int>,Dictionary<string, object>
6. Специальные классификации
Анонимные типы
- Создаются на лету, не имеют явного определения
- Неизменяемы, только для чтения
var person = new { Name = "John", Age = 30 };
Типы кортежей (Tuples)
- Группируют несколько значений в одну переменную
- Значимые типы (System.ValueTuple)
var tuple = (Name: "John", Age: 30);
(int, string) simpleTuple = (1, "text");
Динамические типы
- Проверка типов происходит во время выполнения
- Позволяют взаимодействовать с COM-объектами или динамическими языками
dynamic dynamicValue = 10;
dynamicValue = "Now I'm a string"; // Ошибка времени компиляции не возникает
7. По происхождению в системе типов .NET
Типы CLR (Common Type System)
- Все типы в C# в конечном счете являются типами CLR
- Единая система типов обеспечивает взаимодействие между языками .NET
Псевдонимы типов (Type Aliases)
int(псевдоним дляSystem.Int32)string(псевдоним дляSystem.String)
Понимание этих классификаций позволяет:
- Оптимизировать производительность (выбор между структурой и классом)
- Управлять памятью (понимание стека vs кучи)
- Писать безопасный код (работа с nullable reference types)
- Проектировать расширяемые системы (использование интерфейсов и абстрактных классов)
- Обеспечивать безопасность многопоточности (через неизменяемые типы)
Каждая классификация отражает определенный аспект поведения типа в системе и должна учитываться при проектировании архитектуры приложения.