Методы расширения (extension methods) позволяют добавлять новые методы в уже существующие типы без создания нового производного класса. Эта функциональность бывает особенно полезна, когда нам хочется добавить в некоторый тип новый метод, но сам тип (класс или структуру) мы изменить не можем, поскольку у нас нет доступа к исходному коду. Либо если мы не можем использовать стандартный механизм наследования, например, если классы определенны с модификатором sealed.
Например, нам надо добавить для типа string
новый метод:
string s = "Привет мир"; char c = 'и'; int i = s.CharCount(c); Console.WriteLine(i); public static class StringExtension { public static int CharCount(this string str, char c) { int counter = 0; for (int i = 0; i < str.Length; i++) { if (str[i] == c) counter++; } return counter; } }
Для того, чтобы создать метод расширения, вначале надо создать статический класс, который и будет содержать этот метод. В данном случае это класс
StringExtension
. Затем объявляем статический метод. Суть нашего метода расширения - подсчет количества определенных символов в строке.
Собственно метод расширения - это обычный статический метод, который в качестве первого параметра всегда принимает такую конструкцию:
this имя_типа название_параметра
, то есть в нашем случае this string str
. Так как наш метод будет относиться к типу string,
то мы и используем данный тип.
Затем у всех строк мы можем вызвать данный метод:
int i = s.CharCount(c);
Причем нам уже не надо указывать первый параметр. Значения для остальных параметров передаются в обычном порядке.
Применение методов расширения очень удобно, но при этом надо помнить, что метод расширения никогда не будет вызван, если он имеет ту же сигнатуру, что и метод, изначально определенный в типе.
Также следует учитывать, что методы расширения действуют на уровне пространства имен. То есть, если добавить в проект другое пространство имен, то метод не будет применяться к строкам, и в этом случае надо будет подключить пространство имен метода через директиву using.