Как да работя с методи за разширение в C #

Езикът за програмиране C # осигурява поддръжка на методи за разширение от C # 3.0. Метод на разширение е този, който се използва за разширяване на функционалността на съществуващите типове чрез добавяне на методи, без необходимостта от създаване на нови производни типове. Не е необходимо да създавате подкласове на съществуващи класове или да прекомпилирате или модифицирате съществуващите си класове, за да работите с методи за разширение. Методите за разширение подобряват четливостта на вашия код, като в същото време ви позволяват да разширите функционалността на съществуващите типове.

Общите методи за разширение в .Net включват стандартните оператори за заявки LINQ, които добавят допълнителни възможности за заявки към System.Collections.IEnumerable and System.Collections.Generic.IEnumerableтиповете. Имайте предвид, че можете да се възползвате от методите за разширение, за да разширите клас или интерфейс, но не можете да замените техните методи. MSDN гласи: "Методите за разширение ви позволяват да" добавяте "методи към съществуващите типове, без да създавате нов производен тип, да прекомпилирате или модифицирате по друг начин оригиналния тип. Методите за разширение са специален вид статичен метод, но те се наричат ​​така бяха методи на екземпляр за разширения тип. "

По същество методът на разширението е специален тип статичен метод и ви позволява да добавите функционалност към съществуващ тип, дори ако нямате достъп до изходния код на типа. Методът на разширение е точно като друг статичен метод, но като първи параметър има препратката „this“. Можете да добавите колкото искате методи за удължаване към всеки тип. Най-важното е, че можете също да добавите методи за разширение дори към тип стойност.

Когато работите с методи за удължаване, имайте предвид следните точки:

  • Методът на удължаване трябва да бъде статичен метод
  • Методът на разширение трябва да бъде вътре в статичен клас - класът може да има всяко име
  • Параметърът в метод на разширение винаги трябва да има ключовата дума "this", предшестваща типа, за който методът трябва да бъде извикан

Обърнете внимание, че когато дефинирате метод на разширение за тип, който има същия подпис като всеки друг метод от типа, който разширявате, методът за разширение никога няма да бъде извикан.

Програмиране на методи за разширение в C #

В този раздел ще разгледаме как да програмираме методи за разширение с помощта на C #. Следният списък с кодове илюстрира как изглежда методът на разширение.

public static class StringExtensions

    {

        public static bool IsNumeric(this string str)

        {

            double output;

            return double.TryParse(str, out output);

        }

    }

Обърнете внимание на първия параметър към метода на разширението. Както вече беше обсъдено, всеки метод за разширение трябва да бъде статичен и трябва да има ключова дума „this“, предшестваща параметъра, за който искате методът да бъде извикан. Когато посочите ключовата дума "this" в списъка с параметри по начина, по който е показан в горния пример, информирате компилатора, че методът на разширение е дефиниран за низовия клас.

Ето как можете да използвате метода за разширение IsNumeric в екземпляр на низ.

static void Main(string[] args)

        {

            string str = "100";

            if (str.IsNumeric())

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

            Console.Read();

        }

Когато изпълнявате горната програма, в прозореца на конзолата се показва съобщението ("Низовият обект с име str съдържа числова стойност."

Можете да използвате методи за разширение, за да инжектирате нова функционалност чрез методи, за даден тип, без необходимостта от модифициране, извличане или прекомпилиране на оригиналния тип. Както споменах по-рано, методите за разширение могат да се прилагат и към типовете стойности. Нека да видим как това може да се постигне с пример.

Следващият клас с име IntegerExtensions съдържа метод на разширение с име IsEven, който връща true, ако цялото число, на което е извикано, е четно, в противен случай е false.

public static class IntegerExtensions

    {

        public static bool IsEven(this int i)

        {

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

        }

    }

И ето как можете да използвате метода за разширение IsEven за цяло число.

int n = 2;

if(n.IsEven())

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