Menu
Coddy logo textTech

Методы расширения

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 39 из 70.

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

Чтобы создать метод расширения, определите статический метод в статическом классе, предварив первый параметр ключевым словом this:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

Теперь вы можете напрямую вызвать этот метод для любой строки:

string sentence = "Hello World Today";
int count = sentence.WordCount();  // 3

Параметр this string str сообщает компилятору, что этот method расширяет тип string. Когда вы вызываете sentence.WordCount(), компилятор незаметно преобразует его в StringExtensions.WordCount(sentence).

Методы расширения также могут принимать дополнительные параметры:

public static bool IsLongerThan(this string str, int length)
{
    return str.Length > length;
}

// Использование
bool result = "Hello".IsLongerThan(3);  // true

Этот метод широко используется в LINQ, где такие методы, как Where() и Select(), являются extension methods для IEnumerable. Extension methods эффективны для добавления вспомогательных функций к типам, которыми вы не управляете, благодаря чему ваш код остаётся чистым и выразительным.

challenge icon

Задание

Легко

Давайте создадим набор полезных extension methods для целых чисел, которые добавляют удобную функциональность, которую обычно ожидаешь увидеть встроенной. Вы создадите static class, содержащий extension methods, которые можно напрямую вызывать для любого целого числа, делая ваш код более выразительным и читаемым.

Вы организуете код в двух файлах:

  • IntExtensions.cs: создайте static class с именем IntExtensions в Utilities namespace. Этот class будет содержать extension methods, расширяющие тип int:
    • IsEven() — возвращает true, если number является even, и false в противном случае
    • Square() — возвращает number, multiplied на itself
    • IsInRange(int min, int max) — возвращает true, если number находится between min и max (inclusive), и false в противном случае
    Помните, что extension methods должны быть static methods в static class, а первый parameter должен использовать this keyword, чтобы указать, какой тип вы расширяете.
  • Program.cs: в вашем основном файле считайте целое число из входных данных и продемонстрируйте все три extension methods. Вызовите каждый method непосредственно для целого числа, как будто это встроенный method, а затем выведите results.

Вы получите три входных значения:

  • number для проверки (целое число)
  • Минимальное значение для проверки диапазона (целое число)
  • Максимальное значение для проверки диапазона (целое число)

Выведите результат в следующем формате:

Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}

Например, если входными значениями являются 7, 5 и 10, результат должен быть таким:

Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? True

Обратите внимание, насколько естественно можно написать number.IsEven() и number.Square() — extension methods ощущаются так, словно они всегда были частью типа целого числа!

Попробуйте сами

using System;
using Utilities;

class Program
{
    public static void Main(string[] args)
    {
        // Считать входные данные
        int number = Convert.ToInt32(Console.ReadLine());
        int min = Convert.ToInt32(Console.ReadLine());
        int max = Convert.ToInt32(Console.ReadLine());

        // TODO: Используйте методы расширения для 'number' и выведите результаты
        // Вызовите number.IsEven(), number.Square() и number.IsInRange(min, max)
        // Выведите в формате:
        // Является ли {number} чётным? {True/False}
        // Квадрат {number}: {result}
        // Находится ли {number} в диапазоне [{min}-{max}]? {True/False}

    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C#