Что такое обобщенный тип (generic) в C#?

«Что такое обобщенный тип (generic) в C#?» — вопрос из категории C# Core, который задают на 32% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обобщенные типы (generics) — это механизм C#, позволяющий создавать классы, интерфейсы и методы, которые работают с любыми типами данных, сохраняя строгую проверку типов на этапе компиляции. Они устраняют необходимость приведения типов (casting) и упаковки/распаковки (boxing/unboxing) для значимых типов.

Основная идея: вы пишете код один раз, а компилятор генерирует его специализированные версии для каждого используемого типа.

Пример обобщенного класса:

public class Repository<T>
{
    private List<T> _items = new List<T>();

    public void Add(T item)
    {
        _items.Add(item);
    }

    public T GetById(int id)
    {
        // Логика поиска...
        return _items[id];
    }
}

// Использование с разными типами:
Repository<int> intRepo = new Repository<int>();
intRepo.Add(42); // Компилятор знает, что T — это int

Repository<string> stringRepo = new Repository<string>();
stringRepo.Add("Hello"); // Компилятор знает, что T — это string
// stringRepo.Add(42); // ОШИБКА КОМПИЛЯЦИИ: неверный тип

Ключевые преимущества:

  • Безопасность типов: Ошибки несоответствия типов обнаруживаются на этапе компиляции, а не во время выполнения.
  • Производительность: Для значимых типов (value types) избегается дорогостоящая операция упаковки.
  • Повторное использование кода: Одна реализация работает для множества типов.
  • Читаемость: Код становится более выразительным, так как намерения явно указаны через параметры типа.