Mi sono imbattuto in diversi casi di codice C # come il seguente:
public static int Foo(this MyClass arg)
Non sono stato in grado di trovare una spiegazione del this
significato della parola chiave in questo caso. Qualche intuizione?
Mi sono imbattuto in diversi casi di codice C # come il seguente:
public static int Foo(this MyClass arg)
Non sono stato in grado di trovare una spiegazione del this
significato della parola chiave in questo caso. Qualche intuizione?
Risposte:
Questo è un metodo di estensione . Vedi qui per una spiegazione .
I metodi di estensione consentono agli sviluppatori di aggiungere nuovi metodi al contratto pubblico di un tipo CLR esistente, senza dover sottoclassarlo o ricompilare il tipo originale. I metodi di estensione aiutano a fondere la flessibilità del supporto di "digitazione anatra" oggi popolare nei linguaggi dinamici con le prestazioni e la convalida in fase di compilazione di linguaggi fortemente tipizzati.
I metodi di estensione consentono una varietà di scenari utili e aiutano a rendere possibile il framework di query LINQ davvero potente ....
significa che puoi chiamare
MyClass myClass = new MyClass();
int i = myClass.Foo();
piuttosto che
MyClass myClass = new MyClass();
int i = Foo(myClass);
Ciò consente la costruzione di interfacce fluide come indicato di seguito.
Il post sul blog citato da Scott Gu lo spiega bene.
Per me, la risposta alla domanda è nella seguente dichiarazione in quel post:
Nota come il metodo statico sopra ha una parola chiave "this" prima del primo argomento del parametro di tipo stringa. Questo dice al compilatore che questo particolare metodo di estensione dovrebbe essere aggiunto agli oggetti di tipo "stringa". All'interno dell'implementazione del metodo IsValidEmailAddress () posso quindi accedere a tutte le proprietà / metodi / eventi pubblici dell'istanza di stringa effettiva su cui viene chiamato il metodo e restituire vero / falso a seconda che si tratti di un messaggio di posta elettronica valido o meno.
this
parola chiave nella firma del metodo. Le altre risposte dicono solo inutilmente "è un metodo di estensione". Non ho mai capito fino in fondo come i metodi di estensione "si legano" ai tipi che estendono fino a leggere questa risposta. Grazie!
Oltre alla spiegazione di Preet Sangha:
Intellisense visualizza i metodi di estensione con una freccia blu (ad es. Davanti a "Aggregate <>"):
Hai bisogno di
using the.namespace.of.the.static.class.with.the.extension.methods;
affinché i metodi di estensione appaiano e siano disponibili, se si trovano in uno spazio dei nomi diverso rispetto al codice che li utilizza.
Sono metodi di estensione . Benvenuti in un mondo completamente nuovo e fluente . :)
L'ho imparato da solo l'altro giorno: questa parola chiave definisce quel metodo come un'estensione della classe che lo procede. Quindi, per il tuo esempio, MyClass avrà un nuovo metodo di estensione chiamato Foo (che non accetta alcun parametro e restituisce un int; può essere usato come con qualsiasi altro metodo pubblico).
"this" estende la classe successiva nell'elenco dei parametri
Quindi nella firma del metodo sotto "this" estende "String". La linea viene passata alla funzione come normale argomento del metodo. public static string [] SplitCsvLine (questa linea String)
Nell'esempio sopra "questa" classe estende la classe "String" incorporata.