2010-04-04 25 views
14

voglio chiedere perché usiamo "questa" parola chiave prima del parametro in un metodo di estensione (linguaggio C#) ........... come questa funzione:Perché utilizziamo "questo" nei metodi di estensione?

public static int ToInt(this string number) 
    { 
     return Int32.Parse(number); 
    } 

So che dobbiamo usarlo ma non so perché.

+1

Personalmente avrei preferito un attributo. Qualcosa come [Extends (typeof (foo)] e quindi aveva una variabile implicita chiamata value, simile alle proprietà.Esso sarebbe stato più espressivo e non richiesto un riutilizzo di una parola chiave esistente.Ma solo la mia opinione personale – John

+0

Scott Hanselman ha una buona articolo che spiega l'importanza della parola chiave "this" http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx – Zaffiro

risposta

9

Perché è così che si dice al compilatore che si tratta di un metodo di estensione in primo luogo. Altrimenti è solo un normale metodo statico. Immagino che abbiano scelto this in modo da non dover inventare una nuova parola chiave e potenzialmente rompere il vecchio codice.

+1

E così non hai dovuto taggare il metodo con ExtensionAttribute come fai in VB.Net. –

+2

C# ha zucchero sintattico più delizioso, ed è per questo che mi piace. –

0

Per identificare il metodo come metodo di estensione. Come potrebbe sapere il compilatore?

1

Semplicemente lo contrassegna come un metodo di estensione, questo è il formato con cui hanno scelto di definire il metodo come metodo di estensione, al contrario di un metodo statico semplice (che è come viene chiamato internamente in ogni caso). Questo è solo per il compilatore (e intellisense), sotto le copertine il codice viene compilato come se si stesse chiamando direttamente il metodo statico.

Questa definizione di un metodo:

public static int ToInt(string number) //non extension 

aveva bisogno di essere distinguibile da questo:

public static int ToInt(this string number) //extension 

In caso contrario si avrebbe intellisense contenente ogni metodo statico in una classe statica in spazi dei nomi inclusi, molto indesiderabile.

1

Principalmente perché è come il C# spec definisce un metodo di estensione. Vedi Sezione 10.6.9

10.6.9 metodi di estensione

Quando il primo parametro di un metodo comprende il questo modificatore, che metodo si dice che sia un metodo di estensione . I metodi di estensione possono essere solo dichiarati in classi statiche non generiche, non nidificate . Il primo parametro di un metodo di estensione non può avere modificatori diversi da questo e il tipo di parametro non può essere un puntatore tipo .

6

Per info, il significato di this come contestuale-parola chiave qui è in gran parte che evita l'introduzione di una nuova parola chiave. Ogni volta che si introduce una nuova parola chiave si rischia di violare il codice che lo avrebbe usato come nome di una variabile/tipo.this ha alcune caratteristiche utili:

  • E 'abbastanza ad indicare che questo si riferisce a un metodo di istanza
  • è una parola chiave esistente ...
  • ... che sarebbe stato illegale vicino se utilizzato in tale posizione

Ciò significa che nessun codice esistente verrà addebitato nel codice.

Oltre alla scelta di this come parola chiave, è solo una comoda sintassi per il compilatore e più conveniente rispetto all'aggiunta di [Extension] manualmente. Senza neanche, sarebbe solo un metodo statico, senza alcun comportamento particolare.

Problemi correlati