Come il compilatore C# implementa i metodi di estensione?Come vengono compilati i metodi di estensione?
risposta
Il processo è esattamente la stessa risoluzione di sovraccarico:
Func(myObject);
Le compilatore controlla tutte le funzioni denominate "Func" e cerca di far corrispondere il tipo statico myObject ai parametri predefiniti (eventualmente utilizzando conversioni, upcasting a base classe). Se ha successo, chiama la funzione appropriata.
Se ti rendi conto che è possibile chiamare i metodi estensioni "in modo normale", poi schiarisce:
static class MyExtensions
{
public static void MyFunc(this string arg)
{
// ...
}
}
string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc(); // same as above, but nicer
Per il tipo di dato (qui di stringa), il compilatore sembra proprio per tutte le funzioni statiche con "questo" modificatore sul primo argomento e cerca di far corrispondere il tipo statico a sinistra del. (in questo esempio "a") con il tipo di parametro nella funzione.
I metodi di istanza di una classe hanno un argomento nascosto. Un esempio:
class Example {
public void Foo(int arg) {}
}
si presenta come questo, quando il compilatore JIT è fatto con esso, riconvertito in C# sintassi:
static void Foo(Example this, int arg) {}
Tale argomento nascosto è la ragione per cui è possibile utilizzare questo in un metodo di istanza. Il compilatore JIT calcola l'argomento per passare dal riferimento oggetto fornito per chiamare il metodo Foo.
Come si può vedere, è ora un short hop a un metodo di estensione.
Il compilatore prima cerca nella classe base una funzione corrispondente alla firma della funzione. Se non riesce a trovarlo, cerca un'estensione. Se un'estensione ha la stessa firma di un metodo della classe base, viene chiamato invece il metodo della classe base.
Questo potrebbe aiutare: Extension Methods