← Назад к вопросам

Какие знаешь классификации типов?

1.6 Junior🔥 221 комментариев
#Основы C# и .NET

Комментарии (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)
  • Проектировать расширяемые системы (использование интерфейсов и абстрактных классов)
  • Обеспечивать безопасность многопоточности (через неизменяемые типы)

Каждая классификация отражает определенный аспект поведения типа в системе и должна учитываться при проектировании архитектуры приложения.

Какие знаешь классификации типов? | PrepBro