Metode de extensie
Metodele de extensie (extension methods) permit adăugarea de noi metode în tipuri deja existente, fără a crea o nouă clasă derivată. Această funcționalitate este deosebit de utilă atunci când dorim să adăugăm o nouă metodă unui tip anume, dar nu putem modifica tipul în sine (clasa sau structura) deoarece nu avem acces la codul sursă.
De asemenea, este utilă în cazul în care nu putem folosi mecanismul standard de moștenire, de exemplu, dacă clasele sunt definite cu modificatorul sealed.
Exemplu:
string s = "Salut lume";
char c = 'u';
int i = s.CharCount(c);
Console.WriteLine(i);
public static class StringExtension
{
public static int CharCount(this string str, char c)
{
int counter = 0;
for (int i = 0; i < str.Length; i++)
{
if (str[i] == c)
counter++;
}
return counter;
}
}
Pentru a crea o metodă de extensie, mai întâi trebuie să creăm o clasă statică, care va conține această metodă. În acest caz, aceasta este clasa StringExtension. Apoi declarăm metoda statică. Esența metodei noastre de extensie este să numărăm câte caractere specifice se află într-un șir de caractere.
Metoda de extensie propriu-zisă este o metodă statică obișnuită, care ca prim parametru acceptă întotdeauna o astfel de construcție: this tip_nume parametru_nume, adică în cazul nostru this string str. Deoarece metoda noastră va aparține tipului string, folosim acest tip.
Apoi, putem apela această metodă pentru orice șir de caractere:
int i = s.CharCount(c);
Nu mai trebuie să specificăm primul parametru. Valorile pentru ceilalți parametri se transmit în mod obișnuit.
Utilizarea metodelor de extensie este foarte convenabilă, dar trebuie să ne amintim că o metodă de extensie nu va fi niciodată apelat dacă are aceeași semnătură ca o metodă definit inițial în tip.
De asemenea, trebuie avut în vedere că metodele de extensie funcționează la nivel de spațiu de nume. Adică, dacă adăugăm un alt spațiu de nume în proiect, metoda nu va fi aplicabilă șirurilor de caractere și va trebui să includem spațiul de nume al metodei prin directiva using.