Questa è la sintassi per la dichiarazione dei metodi di estensione, una nuova funzionalità di C # 3.0.
Un metodo di estensione è in parte codice, in parte compilatore "magico", dove il compilatore con l'aiuto di intellisense in Visual Studio fa sembrare che il tuo metodo di estensione sia effettivamente disponibile come metodo di istanza sull'oggetto in questione.
Faccio un esempio.
Non esiste un metodo sulla classe String che si chiama GobbleGobble, quindi creiamo un metodo di estensione:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
Il nome della classe è solo la mia convenzione di denominazione, non è necessario chiamarlo in questo modo, ma deve essere statico, così come il metodo.
Dopo aver dichiarato il metodo sopra, puoi, in Visual Studio, digitare questo:
String s = "Turkey Baster!";
s.
dopo il punto, attendi intellisense e nota che c'è un metodo GobbleGobble lì, completa il codice in questo modo:
String s = "Turkey Baster!";
s.GobbleGobble();
Importante : la classe in cui viene dichiarato il metodo di estensione deve essere disponibile per il compilatore e il processore intellisense affinché intellisense possa mostrare il metodo. Se digiti GobbleGobble manualmente e usi la scorciatoia Ctrl+ ., non ti aiuterà a inserire le direttive using corrette nel file.
Notare che il parametro del metodo è scomparso. Il compilatore si muoverà silenziosamente attorno ai bit importanti, che sono:
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
Pertanto, il codice precedente verrà trasformato dal compilatore in questo:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Quindi, al momento della chiamata, non c'è niente di magico, è solo una chiamata a un metodo statico.
Nota che se il tuo metodo di estensione dichiara più di un parametro, solo il primo supporta il this
modificatore e il resto deve essere specificato come parte della chiamata al metodo come di consueto:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
I metodi di estensione sono stati aggiunti in parte a causa di Linq, dove la sintassi Linq di C # cercherà metodi di estensione con nomi appropriati per gli oggetti in gioco, il che significa che puoi "introdurre" il supporto Linq in qualsiasi tipo di classe semplicemente dichiarando l'estensione corretta metodi. Ovviamente, il supporto completo di Linq richiede molto lavoro, ma è possibile.
Inoltre, i metodi di estensione da soli sono davvero utili, quindi continua a leggere.
Ecco alcuni link: