Найти в Дзене
"Мы"-Прогер

Изучаем C# - Методы расширения

Некоторые классы в C# мы не можем изменить. Например, это классы из разных библиотек. Чтобы изменить их, нужно было бы влезть внутрь библиотеки и отредактировать её, что невозможно. Но бывает, что нам хочется добавить в такие классы новый метод. Решение проблемы есть - написать метод расширения. Метод расширения - это метод, который написан вне класса, но может применяться так же, как обычный метод - объект.Метод() Чтобы сделать метод расширения, нужно соблюсти ряд условий: Пусть даны два списка из строк. Добавим к спискам метод, позволяющий найти более длинный список. Поскольку List<...> - это класс, встроенный в C#, то мы не можем его поменять. Но мы можем сделать метод расширения: По стилю кода метод расширения помещается в классе, который называется КлассExtensions. Например, у нас это ListExtensions. Здесь на строках 7-9 мы использовали тернарный оператор условия: если длина списка list больше или равна длине anotherList, то мы выдаём в ответ list, а иначе - anotherList. Это своео
Оглавление

Что такое методы расширения и зачем они нужны

Некоторые классы в C# мы не можем изменить. Например, это классы из разных библиотек. Чтобы изменить их, нужно было бы влезть внутрь библиотеки и отредактировать её, что невозможно. Но бывает, что нам хочется добавить в такие классы новый метод. Решение проблемы есть - написать метод расширения.

Метод расширения - это метод, который написан вне класса, но может применяться так же, как обычный метод - объект.Метод()

Чтобы сделать метод расширения, нужно соблюсти ряд условий:

  1. Метод должен быть написан в статическом классе (класс должен быть помечен как static);
  2. Сам метод тоже должен быть статическим;
  3. Объект, к которому применяется метод, поступает на вход метода как первый аргумент и помечен специальным ключевым словом this.

Пример

Пусть даны два списка из строк. Добавим к спискам метод, позволяющий найти более длинный список.

Поскольку List<...> - это класс, встроенный в C#, то мы не можем его поменять. Но мы можем сделать метод расширения:

По стилю кода метод расширения помещается в классе, который называется КлассExtensions. Например, у нас это ListExtensions.

Здесь на строках 7-9 мы использовали тернарный оператор условия: если длина списка list больше или равна длине anotherList, то мы выдаём в ответ list, а иначе - anotherList. Это своеобразный внутристрочной вариант условия if.

Использование метода расширения не отличается от обычного метода:

-2

Задача на написание логики: заведите список list3 и найдите самый длинный из трёх списков. А если списка четыре?

Подготовка. Ветки в Git

Если вы хотите попробовать написать примеры, которые будут даваться ниже, и уже имеете написанных животных, то вы можете использовать код из предыдущих статей. Мы можем достать свой старый код из системы контроля версий Git. Сделаем ответвление от того сохранения, где в последний раз были животные. Для этого откроем панель Git Log внизу Rider, найдём сохранение под названием "Абстрактные методы и классы" или "abstract protected-методы":

-3

Нажмём на нём правой кнопкой и выберем New branch... ("новая ветка"). Введём название ветки - "animals":

-4

Оставим галочку Checkout branch, чтобы переключиться на новую ветку. После того, как мы поработаем с животными и сделаем сохранение, вернуться назад на основную ветку (master) можно будет с помощью меню веток вверху Rider:

-5

По-хорошему, переключаться между ветками можно только если у вас нет несохранённых изменений.

Другой пример

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

-6

Использование метода расширения точно такое же, как у обычного метода:

-7

По стилю кода методы расширения для Animal помещают в классе, который называется AnimalExtensions.

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

Linq - это мощная библиотека для работы со списками и вообще со всем, что можно перечислять.

Например, найдём самую быструю черепаху с помощью Linq. Для этого отфильтруем список животных по условию, что животное является черепахой, отсортируем его по убыванию координаты X и возьмём первое животное:

-8

Подробнее про Linq и лямбда-функции можно прочитать в этой статье:

Чтобы использовать методы расширения, находящиеся в каком-нибудь namespace, необходимо импортировать этот namespace с помощью using. К счастью, в новых проектах Linq подключён глобально ко всему проекту:

-9

А в старых проектах в каждом файле, использующем Linq, нужно было писать using System.Linq;

Далее

Универсальные типы

Оглавление

Изучаем C# с нуля - Очень краткий курс - Оглавление
"Мы"-Прогер27 января