0Pricing
C# Academy · Урок

Обобщённые методы

Параметры типов в методах.

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

Что такое обобщённые методы

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

Параметры типа — это такие заполнители, как T. Компилятор подставляет фактический тип в месте вызова, сохраняя строгую типизацию.

void Print<T>(T value)
{
    Console.WriteLine(value);
}

Объявление параметра типа

Список параметров типа <T> располагается между именем метода и списком параметров. Вы можете использовать T как тип параметра, возвращаемого значения или локальной переменной внутри тела метода.

По соглашению параметры одиночного типа называют T; также часто используют описательные имена, например TKey.

T Echo<T>(T input)
{
    return input;
}

Вызов с выводом типа

Обычно Вы не указываете аргумент типа явно. Компилятор выводит T из переданных Вами аргументов.

Здесь из Echo(42) выводится T = int, а из Echo("hi") — T = string. Вывод типа делает вызовы обобщённых методов компактными и понятными.

using System;

class Program
{
    static T Echo<T>(T input) => input;

    static void Main()
    {
        Console.WriteLine(Echo(42));
        Console.WriteLine(Echo("hi"));
    }
}

Явные аргументы типа

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

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

T Create<T>() where T : new() => new T();

// call:
var list = Create<int>();

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

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

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

(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
    return (b, a);
}

Обобщённый обмен значениями

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

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

using System;

class Program
{
    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    static void Main()
    {
        int x = 1, y = 2;
        Swap(ref x, ref y);
        Console.WriteLine($"{x} {y}");
    }
}

Ограничения параметров метода

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

В примере ниже where T : IComparable<T> позволяет безопасно вызывать внутри метода CompareTo.

T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) >= 0 ? a : b;
}

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

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

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

static class Util
{
    public static T First<T>(T[] items) => items[0];
}

Вывод типа из массивов

Вывод типа работает и с аргументами-массивами и коллекциями. Передача int[] автоматически выводит T = int.

Благодаря этому обобщённые алгоритмы воспринимаются как встроенные возможности языка.

using System;

class Program
{
    static T First<T>(T[] items) => items[0];

    static void Main()
    {
        int[] nums = { 10, 20, 30 };
        Console.WriteLine(First(nums));
    }
}

Почему бы просто не использовать object?

До появления обобщений в коде использовались object и приведения типов. Это снижает безопасность типов и упаковывает типы-значения, ухудшая производительность.

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

// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);

Возврат разных типов

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

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

T OrDefault<T>(bool ok, T value)
{
    return ok ? value : default(T);
}

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

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

Повторение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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