Szkoła C# – Metody rozszerzające

W tym wpisie dowiesz się czym są metody rozrzerzające w języku C#. Przedstawię Ci to na prostych i jasnych przykładach.

Szkoła C# – Metody rozszerzające
Photo by Flash Dantz / Unsplash

Bardzo często przy tworzeniu oprogramowania korzysta się z bibliotek zewnętrznych. Zazwyczaj są one udostępnione jako biblioteki dynamiczne DLL (Dynamic-Link Library). Podczas pisania programu, może zdarzyć się sytuacja kiedy będziemy wymagali od takiej biblioteki więcej, aniżeli ona udostępnia. Zamiast przysyłać prośbę o dodanie nowej funkcjonalności do jej autora, sami możemy sobie pomóc, dzięki metodom rozszerzającym.

Czym są metody rozszerzające i w jaki sposób z nich korzystać?

Zanim przedstawię działanie tych metod, chciałbym przedstawić pewien przypadek. Załóżmy, że w naszym rozwijanym projekcie potrzebujemy sprawdzać, czy ciąg znaków, na którym właśnie operujemy, zawiera parzystą ilość znaków.  Najprostsza metoda sprawdzająca to mogłaby wyglądać następująco:

public bool IsEven(string str) 
{ 
   return str.Length % 2 == 0; 
}

W porządku, teraz, aby używać tej metody, musimy tworzyć obiekt (być może jakiejś klasy narzędziowej), aby z niej korzystać lub umieścić ją zwyczajnie w klasie statycznej. Ale czy nie byłoby wspaniale mieć dostęp do niej podczas używania standardowej klasy string? Wywołanie takie wyglądałoby następująco: <ciąg znaków>.IsEven().  Jak to zrobić?

Wystarczy utworzyć statyczną klasę wraz ze statyczną metodą, która jako swój pierwszy parametr przyjmuje nazwę rozszerzanego typu wraz ze słówkiem kluczowym this:

public static class ExtendedString 
{ 
   public static bool IsEven(this string str)  
   { 
       return str.Length % 2 == 0; 
   } 
}

Dzięki temu możemy pozwolić sobie na następujące wywołania:

"Ibiza".IsEven();
ExtendedString.IsEven("Majorka");

Należy pamiętać, że nie jest to żaden magiczny mechanizm i możemy korzystać z danej metody rozszerzającej tylko wtedy gdy klasa zawierająca tę metodę jest w zasięgu dostępności. Zwróćmy uwagę na przypadek, kiedy utworzymy metodę rozszerzającą o takiej samej nazwie jak istniejąca już metoda w klasie rozszerzanej. W takiej sytuacji zawsze będzie wybierana metoda z klasy rozszerzanej, chyba że jednoznacznie wskażemy naszą metodę za pomocą składni statycznej:

NaszaRozszerzonaKlasa.Metoda().

Jak widzisz, metody rozszerzające są bardzo przydatnym mechanizmem w języku C#. Zdecydowanie warto z nich korzystać, aby znacznie ułatwić sobie pracę.