Extension methods C#

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-методов.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *