C#: Class Extensions или Добавление своих методов в классы

Технология .NET предоставляет разработчику множество полезных вещей. Одной из них является возможность пользователю расширять функционал уже реализованного класса, даже если даже если последний используется в качестве библиотечного решения.

Допустим мы часто работаем с числовыми массивами (или списками) и нам периодически необходимо считать среднее хранящееся значение. Конечно мы можем создать функцию которая будет принимать в качестве аргумента список и возвращать среднее значение. Так же мы можем реализовать свой класс, который будет эмитировать работу списка, и в определить нужную нам функцию. Но определенно это не очень красиво.
Именно для решения подобных задач в .NET была реализована возможность создания расширения. Давайте рассмотрим решение описанной выше задачи подсчета среднего числа в списке.

//Класс для хранения методов расширения. Имя может быть любым
public static class ListExtensions
{
   //Метод расширения
   public static double Average(this List arr)
   {
       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 List arr)
   {
       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
Запись опубликована в рубрике C# с метками , , , , , , , . Добавьте в закладки постоянную ссылку.