Обобщённые классы
Повторно используемые типы контейнеров.
«Обобщённые классы» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Обобщённые методы
- Обобщённые классы
- Ограничения where
- Обобщённые интерфейсы