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 сообщает компилятору, что этот метод расширяет тип 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() являются методами расширения для IEnumerable. Методы расширения — это мощный инструмент для добавления вспомогательных функций к типам, которые вы не контролируете, что позволяет сохранять ваш код чистым и выразительным.

challenge icon

Задание

Легко

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

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

  • IntExtensions.cs: Создайте статический класс с именем IntExtensions в пространстве имен Utilities. Этот класс будет содержать методы расширения, дополняющие тип int:
    • IsEven() — возвращает true, если число четное, и false в противном случае
    • Square() — возвращает число, умноженное на само себя
    • IsInRange(int min, int max) — возвращает true, если число находится между min и max (включительно), и false в противном случае
    Помните, что методы расширения должны быть статическими методами в статическом классе, а первый параметр должен использовать ключевое слово this, чтобы указать, какой тип вы расширяете.
  • Program.cs: В основном файле считайте целое число из входных данных и продемонстрируйте работу всех трех методов расширения. Вызовите каждый метод непосредственно для целого числа, как если бы это был встроенный метод, а затем выведите результаты.

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

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

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

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() — методы расширения ощущаются так, будто они всегда были частью типа integer!

Шпаргалка

Методы расширения позволяют добавлять новые методы к существующим типам без изменения их исходного кода. Они должны быть определены как статические методы в статическом классе, при этом перед первым параметром должно стоять ключевое слово 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 перед первым параметром указывает, какой тип расширяется. Компилятор преобразует sentence.WordCount() в StringExtensions.WordCount(sentence).

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

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

bool result = "Hello".IsLongerThan(3);  // true

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

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)
        // Выведите в формате:
        // Is {number} even? {True/False}
        // Square of {number}: {result}
        // Is {number} in range [{min}-{max}]? {True/False}

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

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

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