Теперь вы можете добавить к существующему типу индивидуальные особенности (как будто он всегда их имел). Таким образом, вам не придется перекомпилировать данный объект, не придется вам также создавать второй (производный) объект для добавления этих особенностей. Более того, вы можете добавить в существующий объект метод (при помощи использования новой функциональной возможности компилятора под названием методы расширения (extension methods).
В языках VB и C# это делается несколько по-разному. В VB вы сначала импортируете в ваш кодовый файл пространство имен System. Runtime. CompilerServices. Затем помечаете нужную процедуру Sub или функцию Function директивой <Extension () >. И наконец,
пишете новую Sub или Function, где первый параметр нового метода— это тот тип, который вы хотите расширить. Далее показан пример. В этом примере мы расширяем тип Integer новым методом с названием DoublelnSize:
Imports System.Runtime.CompilerServices
Public Module IntegerExtensions <Extension()> _
Public Function DoublelnSize(ByVal i As Integer) As Integer Return i + i End Function End Module
Компилятору C# подобный импорт или атрибут метода не нужны. Вместо этого вы сначала создаете статический класс. Затем создаете статический метод, который вы собираетесь использовать в качестве расширения. Первый параметр вашего метода расширения должен быть тем типом, который вы хотите расширить. Кроме того, вы применяете модификатор this к этому типу. Обратите внимание на следующий пример. В нем мы расширяем тип данных int новым методом DoublelnSize.
namespace IntegerExtensions {
public static class IntegerExtensions!
public static int DoublelnSize(this int i) { return i+i;
}
}
}
Для использования метода расширения вы должны сначала импортировать в проект (при помощи using в языке С#) новые методы расширения. Затем вы можете вызывать любой новый метод так, как будто он всегда существовал в данном типе. Далее приводится пример на VB и С#. В этом случае функция DoublelnSize (которая была добавлена в предыдущем примере) вызывается из класса integer (int).
□ VB:
Imports IntegerExtensions
Module Modulel Sub Main()
Dim i'As Integer = 10
Console.WriteLine(i.DoublelnSize.ToString())
End Sub End Module
□ C#:
using IntegerExtensions;
namespace CsEnhancements { ,
class Program {
static void Main(string[] args) { int i = 10;
Console.WriteLine(i.DoublelnSize().ToString());
}
}
}