Extension methods C#

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали про наследование в C#. В данной статье я бы хотел поговорить про extension methods в C# (расширяющие методы). Вначале хотелось бы поговорить о том, какие существуют возможности по расширению функциональности классов. Допустим, имеется класс, нам необходимо расширить его возможности, добавив новый метод. Какие для этого есть способы:
1) Очевидный. Если имеется исходный код класса, то просто дописываем этот метод туда.
2) Если мы не можем модифицировать класс по какой-то причине, например, нет исходного кода, т.е. есть просто библиотека (и в ней есть этот класс), или есть исходный код, но мы не хотим его модифицировать. В данном случае можно создать класс-наследник и в нём расширить функционал.
В случае с классом-наследником могут возникнуть проблемы. Например, класс, который мы хотим расширить помечен, как sealed. Другая проблема: во всей программе придётся поменять тип класса-родителя на тип класса-наследника, в противном случае нельзя будет вызывать новый метод (который мы определили в новом классе). Хотелось бы без изменения исходного кода и создания наследников расширять классы новыми методами.
Extension — методы такую возможность как раз и предоставляют.
Синтаксис записи такого метода:
public static int MyMethod(this string str)
Здесь есть странность. Ключевое слово "static" говорит нам о том, что данный метод является статическим. Но на самом деле, в данном случае, это метод объекта, а не класса. Вторая особенность — это первый тип параметра этого метода. Первый тип параметра такого метода — это тип объекта того класса, в который необходимо добавить этот метод. Также обязательно ключевое слово "this". При вызове данный параметр не указывается.
Давайте на конкретном примере разберем, как работать с Extension-методом.
Допустим, мы хотим класс "System.String" расширить каким-нибудь методом.
Напишем метод, который считает количество гласных букв в строке:
// Класс, в котором описан наш метод, должен быть статическим static class ExtensionsForString { // string - как говорит о том, что мы хотим расшрить System.String public static int NumberOfVowels(this string str) { // Создаём массив гласных букв char[] vowels = { 'e', 'y', 'u', 'i', 'o', 'a', 'у', 'е', 'ы', 'а', 'о', 'э', 'я', 'и', 'ю', 'й'}; int count = 0; // Приводим нашу строку к нижнему регистру и преобразовываем в массив символов char foreach (char i in str.ToLower().ToCharArray()) { // Каждый символ строки сравниваем с гласной for (int j = 0; j < vowels.Length; j++) { // Если совпадение найдено, то увеличиваем счетчик if (i == vowels[j]) count++; } } return count; } } class Program { static void Main(string[] args) { string testString = "ExtenSion MethOd - РасшИряющий метОд"; // Методу не нужно ничего передавать, скобки оставляем пустыми Console.WriteLine("Количество гласных = {0}", testString.NumberOfVowels()); // выйдет 14 Console.ReadLine(); } }
Таким образом мы расширили функциональность класса и написали полезный метод.
В качестве домашнего задания: нужно написать метод, который будет расширять класс "System.String". Метод должен четные буквы строки перевести в верхний регистр, а нечетные — в нижний.
В данной статье вы узнали о том, как расширить функциональность классов с помощью extension-методов.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.