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
- 1. I metodi LINQ sono metodi di estensione?
- 2. In che tipo vengono compilati i lambda?
- 3. Perché questi semplici metodi vengono compilati in modo diverso?
- 4. Come vengono compilati i parametri del modello non di tipo?
- 5. Come fare a .gitignore ignora i file compilati senza estensione?
- 6. I valori predefiniti dell'annotazione Java vengono compilati in bytecode?
- 7. I javadoc vengono compilati nei file di classe?
- 8. I metodi di estensione nascondono le dipendenze?
- 9. Aggiungi eventi utilizzando i metodi di estensione
- 10. Estensione di Protobuf con i miei metodi
- 11. Intellisense per i metodi di estensione?
- 12. metodi di estensione statici
- 13. Come organizzare i metodi di estensione di Kotlin
- 14. Metodi di estensione virtuale?
- 15. Come definire i metodi di estensione per la classe generica?
- 16. Come simulare i metodi di estensione con Rhino Mock?
- 17. Come posso trovare tutti i metodi di estensione in soluzione?
- 18. C# utilizzando i parametri e i metodi di estensione
- 19. #define vs enum in un ambiente incorporato (come vengono compilati?)
- 20. Metodi di estensione in Python
- 21. Metodi di estensione - decoratore modello
- 22. C# metodi di estensione ambigui
- 23. Come aggiungere metodi di estensione per enumerazioni
- 24. Come creare metodi di estensione per Tipi
- 25. ASP MVC Razor visualizza i metodi di estensione, come creare metodi di visualizzazione 'globali'?
- 26. Convenzione di denominazione per i metodi di estensione Rx?
- 27. Chiamata di metodo ambigua tra i metodi di estensione
- 28. Metodi di estensione in T4
- 29. Gli esempi nativi di OpenCV non vengono compilati
- 30. più clausole WHERE con i metodi di estensione LINQ