Технология .NET предоставляет разработчику множество полезных вещей. Одной из них является возможность пользователю расширять функционал уже реализованного класса, даже если даже если последний используется в качестве библиотечного решения.
Допустим мы часто работаем с числовыми массивами (или списками) и нам периодически необходимо считать среднее хранящееся значение. Конечно мы можем создать функцию которая будет принимать в качестве аргумента список и возвращать среднее значение. Так же мы можем реализовать свой класс, который будет эмитировать работу списка, и в определить нужную нам функцию. Но определенно это не очень красиво.
Именно для решения подобных задач в .NET была реализована возможность создания расширения. Давайте рассмотрим решение описанной выше задачи подсчета среднего числа в списке.
//Класс для хранения методов расширения. Имя может быть любым public static class ListExtensions { //Метод расширения public static double Average(this Listarr) { double average = 0; for (int i = 0; i < arr.Count; ++i) { avverage += (arr[i] / arr.Count); } return average ; } }
Как видно из примера метод расширения это статическая функция, которая в качестве первого аргумента принимает тип, который мы хотим расширить с обязательным ключевым словом this. Все остальные параметры, указанные в функции будут восприниматься как параметры функции. Например:
public static class ListExtensions { public static double Average(this Listarr) { double average = 0; for (int i = 0; i < arr.Count; ++i) { average += (arr[i] / arr.Count); } return average ; } public static double PartialAverage(this List arr, int length) { if(length > arr.Count) { throw new IndexOutOfRangeException(); } double average = 0; for (int i = 0; i < length; ++i) { average += (arr[i] / length); } return average ; } } ..... List data = new List () { 1, 2, 3, 4, 5 }; double result1 = data.Average(); //result1 = 3 double result2 = data.PartialAverage(2); //result2 = 1.5