Обобщённые методы и типы; ограничения
Пишите обобщённые методы и типы; добавляйте ограничения с помощью where T : … (class, struct, new(), интерфейс/базовый тип).
«Обобщённые методы и типы; ограничения» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Обзор обобщений
Цель: безопасно переиспользовать код с помощью обобщений.
- Обобщённые методы и типы
- Ограничения: класс, структура, конструктор без параметров, интерфейс или базовый тип
- Делайте примеры небольшими и понятными
Обобщённый метод
Обобщённый метод имеет список параметров типа и работает со множеством типов.
using System;
// Generic method works for any T
public class Program
{
static T Identity<T>(T value)
{
// just returns what it got
return value;
}
public static void Main(string[] args)
{
int a = Identity<int>(5);
string b = Identity<string>("hi");
Console.WriteLine(a + " & " + b);
}
}
Обобщённый тип
Обобщённый тип (например, Box<T>) компилируется один раз и используется с множеством конкретных типов.
using System;
// Simple generic type to hold a value
public sealed class Box<T>
{
private T _value;
public Box(T value) { _value = value; }
public T Get() { return _value; }
public void Set(T value) { _value = value; }
}
public class Program
{
public static void Main(string[] args)
{
Box<int> bi = new Box<int>(10);
Box<string> bs = new Box<string>("ok");
Console.WriteLine(bi.Get() + " | " + bs.Get());
}
}
Ограничение создания экземпляра
Добавьте ограничение, разрешающее создавать экземпляр типа внутри обобщённого кода.
using System;
// Factory that can create T with a parameterless ctor
public static class Factory
{
public static T Create<T>() where T : new()
{
return new T(); // allowed thanks to new() constraint
}
}
public sealed class Person
{
public string Name;
public Person() { Name = "Anon"; }
}
public class Program
{
public static void Main(string[] args)
{
Person p = Factory.Create<Person>();
Console.WriteLine(p.Name);
}
}
Ограничение интерфейсом
Ограничьте T интерфейсом или базовым типом, чтобы вызывать его члены.
using System;
// Min for two values that can be compared
public static class Utils
{
public static T Min<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) <= 0 ? a : b;
}
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(Utils.Min(5, 3)); // 3
Console.WriteLine(Utils.Min("b", "a")); // a
}
}
Ограничения класса и структуры и советы
Другие ограничения:
- Ограничение ссылочного типа → только ссылочные типы
- Ограничение типа-значения → типы-значения, допускающие значение по умолчанию, но не null
- Ограничения можно объединять: ссылочный тип, IDisposable и конструктор без параметров
- Делайте внешние интерфейсы минимальными; для гибкости предпочитайте ограничения интерфейсами.
Значение ограничения создания экземпляра
Повторение
Повторение: создавайте обобщённые методы и типы и добавляйте ограничения, чтобы использовать необходимые члены: интерфейс или базовый тип — для поведения, класс или структура — для вида типа, а конструктор без параметров — для создания экземпляра.
Часто задаваемые вопросы
Урок «Обобщённые методы и типы; ограничения» бесплатный?
Да — полный текст урока «Обобщённые методы и типы; ограничения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «Обобщённые методы и типы; ограничения»?
Пишите обобщённые методы и типы; добавляйте ограничения с помощью where T : … (class, struct, new(), интерфейс/базовый тип). Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Обобщённые методы и типы; ограничения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обобщённые методы и типы; ограничения
- Вариативность (in/out) с интерфейсами и делегатами
- Ссылочные типы, допускающие null (обзор), и аннотации (шаблоны C# 6)