Jak pracować z metodami rozszerzającymi w C #

Język programowania C # zapewnia obsługę metod rozszerzających z języka C # 3.0. Metoda rozszerzenia to taka, która służy do rozszerzania funkcjonalności istniejących typów poprzez dodawanie metod bez konieczności tworzenia nowych typów pochodnych. Nie musisz tworzyć podklas istniejących klas ani ponownie kompilować ani modyfikować istniejących klas, aby działały z metodami rozszerzającymi. Metody rozszerzające poprawiają czytelność kodu, jednocześnie umożliwiając rozszerzenie funkcjonalności istniejących typów.

Typowe metody rozszerzające w .Net obejmują standardowe operatory zapytań LINQ, które dodają dodatkowe możliwości zapytań do System.Collections.IEnumerable and System.Collections.Generic.IEnumerabletypów. Zauważ, że możesz skorzystać z metod rozszerzających, aby rozszerzyć klasę lub interfejs, ale nie możesz zastąpić ich metod. MSDN stwierdza: „Metody rozszerzające umożliwiają„ dodawanie ”metod do istniejących typów bez tworzenia nowego typu pochodnego, ponownej kompilacji lub innego modyfikowania typu oryginalnego. Metody rozszerzające są specjalnym rodzajem metod statycznych, ale są wywoływane tak, jakby były metodami instancji typu rozszerzonego. "

Zasadniczo metoda rozszerzenia jest specjalnym typem metody statycznej i umożliwia dodawanie funkcji do istniejącego typu, nawet jeśli nie masz dostępu do kodu źródłowego tego typu. Metoda rozszerzająca jest podobna do innej metody statycznej, ale ma odwołanie „this” jako pierwszy parametr. Możesz dodać dowolną liczbę metod rozszerzających do dowolnego typu. Co najważniejsze, możesz również dodać metody rozszerzające nawet do typu wartości.

Podczas pracy z metodami rozszerzającymi należy pamiętać o następujących kwestiach:

  • Metoda rozszerzająca musi być metodą statyczną
  • Metoda rozszerzająca musi znajdować się wewnątrz klasy statycznej - klasa może mieć dowolną nazwę
  • Parametr w metodzie rozszerzenia powinien zawsze mieć słowo kluczowe „this” poprzedzające typ, dla którego metoda ma zostać wywołana

Zauważ, że jeśli zdefiniujesz metodę rozszerzenia dla typu, który ma ten sam podpis, co każda inna metoda typu, który rozszerzasz, metoda rozszerzenia nigdy nie zostanie wywołana.

Programowanie metod rozszerzających w C #

W tej sekcji omówimy, jak programować metody rozszerzające w języku C #. Poniższa lista kodu ilustruje, jak wygląda metoda rozszerzenia.

public static class StringExtensions

    {

        public static bool IsNumeric(this string str)

        {

            double output;

            return double.TryParse(str, out output);

        }

    }

Zwróć uwagę na pierwszy parametr metody rozszerzenia. Jak już wspomniano, każda metoda rozszerzająca powinna być statyczna i powinna mieć słowo kluczowe „this” przed parametrem, dla którego metoda ma być wywoływana. Określając słowo kluczowe „this” na liście parametrów w sposób pokazany w powyższym przykładzie, informujesz kompilator, że dla klasy string została zdefiniowana metoda rozszerzenia.

Oto, jak można użyć metody rozszerzenia IsNumeric w wystąpieniu ciągu.

static void Main(string[] args)

        {

            string str = "100";

            if (str.IsNumeric())

                Console.WriteLine("The string object named str contains numeric value.");

            Console.Read();

        }

Po uruchomieniu powyższego programu w oknie konsoli wyświetlany jest komunikat („Obiekt ciągu o nazwie str zawiera wartość liczbową”.

Możesz użyć metod rozszerzających, aby wstrzyknąć nową funkcjonalność za pomocą metod do typu bez konieczności modyfikowania, wyprowadzania lub ponownej kompilacji typu oryginalnego. Jak wspomniałem wcześniej, metody rozszerzające można również zastosować do typów wartości. Zobaczmy, jak można to osiągnąć na przykładzie.

Następująca klasa o nazwie IntegerExtensions zawiera metodę rozszerzającą o nazwie IsEven, która zwraca wartość true, jeśli liczba całkowita, na której jest wywoływana, jest parzysta, lub false w przeciwnym razie.

public static class IntegerExtensions

    {

        public static bool IsEven(this int i)

        {

            return ((i % 2) == 0);

        }

    }

A oto, jak możesz użyć metody rozszerzenia IsEven na liczbie całkowitej.

int n = 2;

if(n.IsEven())

 Console.WriteLine("The value of the integer is even.");