¿Cómo implementa el compilador C# los métodos de extensión?¿Cómo se compilan los métodos de extensión?
Respuesta
El proceso es exactamente la misma que la resolución de sobrecarga:
Func(myObject);
El compilador comprueba todas las funciones con nombre "Func" y trata de hacer coincidir el tipo estático de myObject a los parametros (posiblemente utilizando las conversiones, upcasting a la base clase). Si tiene éxito, llama a la función apropiada.
Si se da cuenta de que se puede llamar a los métodos extensiones "de una manera normal", entonces se aclara:
static class MyExtensions
{
public static void MyFunc(this string arg)
{
// ...
}
}
string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc(); // same as above, but nicer
Para el tipo determinado (en este caso cadena), el compilador sólo se ve para todas las funciones estáticas con "this" modificador en el primer argumento e intenta hacer coincidir el tipo estático a la izquierda del. (en este ejemplo "a") con el tipo de parámetro en la función.
Los métodos de instancia de una clase tienen un argumento oculto. Un ejemplo:
class Example {
public void Foo(int arg) {}
}
en realidad se parece a esto cuando el compilador JIT se hace con ella, convierte de nuevo en sintaxis de C#:
static void Foo(Example this, int arg) {}
Ese argumento oculta es la razón por la que se puede utilizar este en un método de instancia. El compilador JIT determina el argumento que debe pasar desde la referencia del objeto que usted proporciona para llamar al método Foo.
Como puede ver, ahora es muy salto corto a un método de extensión.
El compilador busca primero en la clase base una función que coincida con la firma de la función. Si no puede encontrarlo, busca una extensión. Si una extensión tiene la misma firma que un método de clase base, en lugar de eso se llama al método de clase base.
Esto podría ayudar: Extension Methods
- 1. Cómo se conectan los métodos de extensión
- 2. ¿Los métodos estáticos se compilan con entusiasmo (JIT)?
- 3. ¿Los métodos LINQ son métodos de extensión?
- 4. Reemplazando los métodos de extensión
- 5. ¿Cómo agrupar los métodos de extensión?
- 6. ¿Los métodos de extensión ocultan las dependencias?
- 7. ¿Cómo se compilan los genéricos mediante el compilador JIT?
- 8. ¿Cuándo deberían evitarse los métodos de extensión?
- 9. ¿Qué son los métodos de extensión?
- 10. ¿Cómo extiendo una clase con los métodos de extensión C#?
- 11. ¿Métodos de extensión virtual?
- 12. ¿Cómo puedo encontrar todos los métodos de extensión en solución?
- 13. Organización de métodos de extensión
- 14. "nivel de pila demasiado profundo" mientras se compilan los activos
- 15. ¿Por qué estos métodos simples compilan de manera diferente?
- 16. métodos de extensión estáticas
- 17. equivalente de Scala de los métodos de extensión de C#?
- 18. múltiples cláusulas WHERE con los métodos de extensión de LINQ
- 19. Métodos oficiales de extensión LINQ
- 20. Métodos de extensión de enumeración
- 21. ¿Dónde se compilan los archivos JSP Java (* __ jsp.java)?
- 22. C# métodos de extensión ambiguos
- 23. Métodos de extensión en Python
- 24. Métodos de extensión no reconocidos
- 25. ¿Cómo se definen los métodos de extensión para la clase genérica?
- 26. Los métodos estáticos de extensión de apoyo limitaciones miembros
- 27. Uso de IoC en los métodos de extensión
- 28. ¿Deben los métodos de extensión tener un prefijo?
- 29. ¿Cuándo compilan los compiladores el código en C++?
- 30. Mejores prácticas: C# Espacio de nombres de métodos de extensión y promoción de métodos de extensión