2013-05-10 10 views
5

Ho letto codice C# open source e c'è molta grammatica strana (per me).Cosa si usa per "questo" in linguaggio C#?

Dichiarano argomenti del metodo con il questo parole chiave come questo:

questo oggetto @object

Che cosa significa?

Se rimuovo "questa" parola chiave prima del tipo di dati, funzionerà diversamente?

+3

C# è molto bello grammatica, infatti, se lo si confronta con C++ –

risposta

23

Suoni come un Extension Method.

Il simbolo @ consente al nome della variabile di essere lo stesso di una parola chiave C# - Tendo ad evitarli come la peste di persona.

Se si rimuove la parola chiave this, non sarà più un metodo di estensione, ma solo un metodo statico. A seconda della sintassi del codice chiamante, non può più compilare, ad esempio:

public static class IntegerMethods 
{ 
    public static int Add(this int i, int value) 
    { 
     return i + value; 
    } 
} 

int i = 0; 

// This is an "extension method" call, and will only compile against extension methods. 
i = i.Add(2); 
// This is a standard static method call. 
i = IntegerMethods.Add(i, 2); 

Il compilatore si limiterà a tradurre tutti "chiamate di metodo estensione" in metodo statico standard di chiamate in ogni caso, ma le chiamate di metodo estensione sarà ancora solo lavorare con metodi di estensione validi secondo la sintassi this type name.

Alcune linee guida

Queste sono mie, ma trovo che siano utili.

  • Discoverability di metodi di estensione può essere un problema, in modo da essere consapevoli dello spazio dei nomi si sceglie di contenerli in. Abbiamo molto utile roba sotto i namespace .NET quali System.Collections o qualsiasi altra cosa. Cose meno utili ma altrimenti "comuni" tendono ad andare sotto lo Extensions.<namespace of extended type> in modo tale che la rilevabilità sia almeno coerente per convenzione.
  • Provare a non estendere i tipi utilizzati di frequente in ambito ampio, non si desidera MyFabulousExtensionMethod visualizzato su object in tutta l'app. Se hai a, vincola lo scope (namespace) a molto o ignora i metodi di estensione e usa direttamente una classe statica - questi non inquinano i metadati di tipo in IntelliSense.
  • Nei metodi di estensione, "questo" può essere null (a causa del modo in cui vengono compilati in chiamate al metodo statico) quindi fare attenzione e non assumere che "questo" non sia nullo (dal lato chiamante questo sembra un metodo riuscito chiamare su un obiettivo nullo).

Questi sono facoltativi e non esaustivi, ma trovo che di solito rientrano nella bandiera del "buon" consiglio. YMMV.

+0

L'unica volta che li ho usati è per i metodi di estensione, per chiamare il parametro 'this'' @ this'. Anche se sto arrivando alla conclusione che è "troppo carino". –

+0

@MatthewWatson, chiamo solo il parametro 'this'' self'. Lavori. –

+0

'meh' funziona anche come un" questo "nome ;-) –

4

La sintassi "nome tipo" viene utilizzata per i metodi di estensione.

Per esempio se volessi aggiungere un metodo UnCamelCase in una stringa (così ho potuto fare "HelloWorld".UnCamelCase() per la produzione di "Ciao World` - mi piacerebbe scrivere questo:

public static string UnCamelCase(this string text) 
{ 
    /*match any instances of a lower case character followed by an upper case 
    * one, and replace them with the same characters with a space between them*/ 
    return Regex.Replace(text, "([a-z])([A-Z])", "$1 $2"); 
} 

this string text significa l'istanza specifica del stringa che si sta lavorando con, e il testo è l'identificatore per esso.

la sintassi @ permette di nomi di variabili che sono normalmente riservati.