Utilizzo della parola chiave "this" in parametri formali per metodi statici in C #


286

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 thissignificato della parola chiave in questo caso. Qualche intuizione?


10
Oltre alla risposta accettata, per i metodi di estensione C # è necessario consultare la documentazione MSDN ufficiale .
corvo vulcanico

4
I metodi di estensione sono convenienti ma dobbiamo fare attenzione quando li creiamo / li usi: possono rompersi! Citazione dalle Linee guida generali nella documentazione ufficiale MSDN : "In generale, ti consigliamo di implementare i metodi di estensione con parsimonia e solo quando devi. ... Quando usi un metodo di estensione per estendere un tipo il cui codice sorgente non puoi cambiare, tu correre il rischio che una modifica dell'implementazione del tipo provochi l'interruzione del metodo di estensione ".
Krishna Gupta,

Ciò significa che ciò sarebbe possibile? Perché è quello che sto cercando.
facepalm42,

Risposte:


274

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.


la sottoclasse è difficile
Gerry

@Gerry - che vuoi dire?
Preet Sangha,

9
Scusate, un po 'di sarcasmo - molta sintassi in questi giorni sembra risolvere problemi che non sapevo nemmeno fossero problemi. La leggibilità dovrebbe essere una priorità molto alta.
Gerry

2
A dire il vero @Gerry, sembra che tu sia in un classico Blado Paradox . Molta sintassi in questi giorni risolve i problemi che non si verificano perché non sapevi che esisteva un modo migliore o non stai facendo il tipo di attività per cui questa sintassi è fantastica. La maggior parte dei commenti su " questa è una soluzione alla ricerca di un problema " sono in realtà un esempio di " Non so come funzioni, quindi deve essere inutile ".
Myrddin Emrys,

53

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.


9
Questa dovrebbe essere la risposta accettata. È l'unica risposta che spiega in realtà qual è lo scopo effettivo della thisparola 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!
Lews Therin,

13

Oltre alla spiegazione di Preet Sangha:
Intellisense visualizza i metodi di estensione con una freccia blu (ad es. Davanti a "Aggregate <>"):

inserisci qui la descrizione dell'immagine

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.



4

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).


1

"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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.