To jest składnia deklarowania metod rozszerzenia, nowa funkcja języka C # 3.0.
Metodą rozszerzającą jest kod częściowy, kompilator częściowy „magiczny”, w którym kompilator z pomocą funkcji Intellisense w programie Visual Studio sprawia, że wygląda na to, że metoda rozszerzenia jest faktycznie dostępna jako metoda instancji danego obiektu.
Podam przykład.
W klasie String nie ma metody o nazwie GobbleGobble, więc stwórzmy metodę rozszerzającą:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
Nazwa klasy jest po prostu moją konwencją nazewnictwa, nie jest konieczne nazywanie jej w ten sposób, ale musi być statyczna, podobnie jak metoda.
Po zadeklarowaniu powyższej metody możesz w programie Visual Studio wpisać:
String s = "Turkey Baster!";
s.
po kropce poczekaj na intelisense i zauważ, że jest tam metoda GobbleGobble, uzupełnij kod w ten sposób:
String s = "Turkey Baster!";
s.GobbleGobble();
Ważne : Klasa, w której zadeklarowano metodę rozszerzającą, musi być dostępna dla kompilatora i procesora Intellisense, aby funkcja Intellisense mogła wyświetlić metodę. Jeśli wpiszesz GobbleGobble ręcznie i użyj rozszerzeniaCtrl. skrótu + , nie pomoże ci to we wprowadzeniu odpowiednich dyrektyw do pliku.
Zwróć uwagę, że parametr metody zniknął. Kompilator po cichu porusza się po ważnych bitach, którymi są:
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
Zatem powyższy kod zostanie przekształcony przez kompilator do tego:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Więc w czasie rozmowy nie ma w tym nic magicznego, to po prostu wywołanie metody statycznej.
Zauważ, że jeśli twoja metoda rozszerzająca deklaruje więcej niż jeden parametr, tylko pierwszy obsługuje this
modyfikator, a reszta musi być określona jako część wywołania metody normalnie:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Metody rozszerzające zostały dodane częściowo ze względu na Linq, gdzie składnia Linq języka C # będzie szukała odpowiednio nazwanych metod rozszerzających dla obiektów w grze, co oznacza, że można „wprowadzić” obsługę Linq do dowolnego typu klasy, po prostu zadeklarując odpowiednie rozszerzenie metody. Oczywiście pełne wsparcie Linq to dużo pracy, ale jest możliwe.
Również same metody rozszerzające są bardzo przydatne, więc przeczytaj je.
Oto kilka linków: