Metode extensie (Extension methods)

Prin introducerea metodelor extensie (extension methods) in limbajul C#, Microsoft ofera posibilitatea extinderii unei clase cu metode aditionale. Prin "extindere" nu ma refer la o suprascriere a unei clase in sensul mostenirii. Asta nu inseamna insa ca acele extensii vor fi parte a clasei tinta, ci doar ca acele extensii pot fi apelata ca si cum ar fi membre ale clasei pe care o extind.

Metodele extensie sunt statice si sunt definite in clase statice. Aceste metode au cel putin un argument de tipul clasei pe care urmeaza sa o extinda. Acest argument este identificat de cuvantul cheie this. Mai jos am definit o astfel de metoda extensie, WordCount, care extinde clasa System.String si numara cuvintele dintr-un string (exemplul este din MSDN).

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

Metoda extensie tocmai definita poate fi apelata ca si cum ar fi parte a clasei System.String, astfel:

using ExtensionMethods;
...
string s = "Hello Extension Methods";
int i = s.WordCount();

Metodele extensie sunt foarte utile atunci cand aveam de-a face cu clase sealed, care nu pot fi mostenite (ex: clasa System.String), ele asigurand o modalitate de a extinde aceste clase.

Deasemenea, LINQ se bazeaza pe metode extensie, operatorii sai extinzand clasele IEnumerable si IEnumerable<T>, facand posibil urmatoarea secventa de cod, care sorteaza un sir de intregi:

using System.Linq;
...
int[] ints = { 10, 45, 15, 39, 21, 26 };
var result = ints.OrderBy(g => g);
foreach (var i in result)
    System.Console.Write(i + " ");

OBSERVATIE: O metoda extensie care suprascrie o metoda a clasei tinta, nu va fi apelata niciodata, intotdeauna fiind apelata metoda clasei tinta.

Niciun comentariu:

Trimiteți un comentariu