La respuesta a 1,2 y 4 es prácticamente la misma. Los métodos de extensión son simplemente métodos estáticos con algún azúcar sintáctico especial.Este:
public static void DoIt(this string str) {
// ..
}
"test".DoIt();
es efectivamente la misma IL como:
public static void DoIt(string str) {
// ..
}
DoIt("test");
El primer método hace que sea mucho más fácil para proporcionar compatibilidad con IntelliSense sin embargo. La restricción de que la clase necesite ser estática es probablemente solo una decisión de diseño, o tal vez relacionada con el rendimiento.
La respuesta al n. ° 3 es que es la sintaxis que eligieron los diseñadores de idiomas. Los desarrolladores de C# se usan para this
en referencia al objeto de instancia. Podrían haberlo llamado blah
, pero no habría sido tan obvio como lo que es el objeto instancia.
El uso de la palabra clave this en un método de extensión también le dice al compilador de C# para marcarla con el ExtensionAttribute. Los consumidores del ensamblaje utilizan este atributo para buscar métodos de extensión.
http://msdn.microsoft.com/en-us/library/bb383977.aspx – Gabriel
Estoy especialmente interesado en el aspecto de asignación de memoria de los métodos de extensión, ya que linq los usa en todas partes. –
El espectáculo lo ejecutan ** CompilerServices.ExtensionAttribute ** – V4Vendetta