0Pricing
C# Academy · Урок

Обобщённые классы

Повторно используемые типы контейнеров.

«Обобщённые классы» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Что такое обобщённый класс?

Обобщённый класс объявляет один или несколько параметров типа в угловых скобках после имени класса. Эти параметры можно использовать для полей, свойств, сигнатур методов и возвращаемых типов во всём классе.

Это позволяет написать один контейнер или службу, работающие со множеством типов элементов и сохраняющие строгую типизацию.

class Box<T>
{
    public T Value { get; set; }
}

Создание экземпляра обобщённого класса

Чтобы создать экземпляр, укажите конкретный аргумент типа. Box<int> и Box<string> — разные сконструированные типы.

Каждый сконструированный тип ведёт себя так, как если бы его T везде заменили реальным типом.

using System;

class Box<T> { public T Value { get; set; } }

class Program
{
    static void Main()
    {
        var b = new Box<int> { Value = 7 };
        Console.WriteLine(b.Value);
    }
}

Обобщённые поля и свойства

Параметры типа можно использовать как тип полей и свойств. Стек, очередь или кэш часто хранит данные в массиве или списке T.

Внутреннее хранилище остаётся типобезопасным и не требует приведений типов.

class Pair<T>
{
    public T First;
    public T Second;
}

Несколько параметров типа

Класс может принимать несколько параметров типа. Для типа, представляющего пару ключа и значения, или типа в стиле словаря, обычно используются два параметра.

Описательные имена, такие как TKey и TValue, повышают понятность, когда параметров несколько.

class Entry<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

Простой обобщённый стек

Ниже показан небольшой обобщённый стек на основе List<T>. Push добавляет элемент в конец, а Pop удаляет элемент с конца.

Один и тот же класс подходит для целых чисел, строк и любых ссылочных типов или типов-значений.

using System;
using System.Collections.Generic;

class MyStack<T>
{
    private readonly List<T> items = new();
    public void Push(T item) => items.Add(item);
    public T Pop()
    {
        var i = items[^1];
        items.RemoveAt(items.Count - 1);
        return i;
    }
}

class Program
{
    static void Main()
    {
        var s = new MyStack<string>();
        s.Push("a");
        s.Push("b");
        Console.WriteLine(s.Pop());
    }
}

Обобщённые методы внутри обобщённых классов

Обобщённый класс также может объявлять дополнительные параметры типа у отдельных методов. Эти параметры уровня метода не зависят от параметров самого класса.

Это повышает гибкость, например позволяя преобразовывать сохранённый тип в другой тип.

class Box<T>
{
    public T Value;
    public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}

Ограничения класса

Как и методы, обобщённый класс может ограничивать свои параметры типа с помощью where. Ограничение применяется к каждому члену, использующему этот параметр.

В примере ниже where T : class разрешает присваивание null и сравнение ссылок.

class Repository<T> where T : class
{
    private T current;
    public bool IsEmpty => current is null;
}

Статические члены существуют отдельно для каждого типа

Каждый сконструированный обобщённый тип получает собственную копию статических полей. Counter<int> и Counter<string> ведут отдельные счётчики.

Это тонкое, но важное отличие от необобщённых классов.

class Counter<T>
{
    public static int Count;
}

Значения по умолчанию в обобщённых классах

Внутри обобщённого класса часто требуется начальное значение для поля типа T. Используйте default(T) или сокращённую форму default, если тип известен из контекста.

Для ссылочных типов это даёт null, а для типов-значений — нулевое значение.

class Slot<T>
{
    public T Value = default!;
    public bool HasValue { get; private set; }
}

Наследование от обобщённого класса

Можно наследоваться от обобщённого базового класса. Подкласс может зафиксировать аргумент типа или остаться обобщённым.

Фиксация специализирует базовый класс, а сохранение обобщённости передаёт параметр дальше по иерархии.

class Box<T> { public T Value; }

class IntBox : Box<int> { }

class NamedBox<T> : Box<T> { public string Name; }

Обобщения и встроенные коллекции

Базовая библиотека .NET содержит множество обобщённых классов: List<T>, Dictionary<TKey, TValue> и Queue<T>. Это повседневная практическая польза проектирования обобщённых классов.

Создание собственных обобщённых типов позволяет расширить этот безопасный и повторно используемый подход.

using System.Collections.Generic;

var scores = new Dictionary<string, int>();
scores["ada"] = 95;

Быстрая проверка

Проверьте, насколько Вы понимаете обобщённые классы.

Повторение

Обобщённые классы объявляют параметры типа после имени класса и используют их для полей, свойств и методов. Их создают с конкретными аргументами типа, получая разные типы.

Они могут добавлять параметры типа на уровне методов, содержать ограничения where, участвовать в наследовании и хранить статическое состояние, отдельное для каждого типа. Встроенные коллекции — главный пример.

Часто задаваемые вопросы

Урок «Обобщённые классы» бесплатный?

Да — полный текст урока «Обобщённые классы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обобщённые классы»?

Повторно используемые типы контейнеров. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Обобщённые классы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обобщённые методы
  2. Обобщённые классы
  3. Ограничения where
  4. Обобщённые интерфейсы
← Назад к C# Academy