Методы расширения
Часть раздела Объектно-ориентированное программирование путешествия по 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 эффективны для добавления вспомогательных функций к типам, которыми вы не управляете, благодаря чему ваш код остаётся чистым и выразительным.
Задание
ЛегкоДавайте создадим набор полезных extension methods для целых чисел, которые добавляют удобную функциональность, которую обычно ожидаешь увидеть встроенной. Вы создадите static class, содержащий extension methods, которые можно напрямую вызывать для любого целого числа, делая ваш код более выразительным и читаемым.
Вы организуете код в двух файлах:
IntExtensions.cs: создайте static class с именемIntExtensionsвUtilitiesnamespace. Этот class будет содержать extension methods, расширяющие типint:IsEven()— возвращаетtrue, если number является even, иfalseв противном случаеSquare()— возвращает number, multiplied на itselfIsInRange(int min, int max)— возвращаетtrue, если number находится between min и max (inclusive), иfalseв противном случае
thiskeyword, чтобы указать, какой тип вы расширяете.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}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методовПотренируйтесь самостоятельно: Онлайн-компилятор C#