2011-04-20 13 views
8

algunas preguntas acerca de métodos de extensión:¿Por qué son "estáticos" y "esto" necesarios para los métodos de extensión, y cómo se asigna su memoria?

  1. ¿Por qué métodos de extensión estática?

  2. ¿Por qué tienen que ser declarada en una clase estática?

  3. ¿Qué dice la palabra clave this indica en la lista de parámetros del método de extensión? Como es una clase estática, ¿cómo funciona la palabra clave "this" en este contexto?

  4. ¿Cómo ocurre la asignación de memoria para este tipo de métodos?

+4

http://msdn.microsoft.com/en-us/library/bb383977.aspx – Gabriel

+0

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. –

+0

El espectáculo lo ejecutan ** CompilerServices.ExtensionAttribute ** – V4Vendetta

Respuesta

8

La única diferencia entre un un método no estático estática y es que un método no estático recibe un parámetro implícito - this. Los métodos de extensión no se llaman en el contexto del objeto en el que se declara el método, por lo tanto, no hay forma de pasarlos a la referencia this, por lo tanto, deben ser estáticos.

No se puede utilizar la palabra clave this dentro de un método de extensión, espero que esto responda a su tercera pregunta. La palabra clave this en la lista de parámetros está allí solo para indicar qué tipo de este método se extiende.

¿Cuál es su pregunta acerca de la asignación de memoria? Un método de extensión es como cualquier otro método estático, solo la sintaxis de llamada es diferente.

+0

Hmm, ¿los métodos ordinarios no estáticos también reciben un parámetro 'this' implícito? ¿O es un detalle de implementación que es específico de C++? –

+0

@Cody Sí, lo hacen.Por alguna razón, Robert Harvey editó mi respuesta a algo incorrecto y diferente de lo que quise decir. Lo volví a enrollar ahora. –

0

eso es sólo la forma en que están definidas - con esta palabra clave que precede al primer parámetro, que es la instancia del objeto que está llamando el método sucesivamente. ¿Por qué ToString() se llama ToString()? ¿Por qué se usa estática para estática? ¿Por qué es verde la hierba? Supongo que los poderes decidieron poner esto delante del primer parámetro, en lugar de proponer una nueva palabra clave "extensión" para poner delante del nombre del método.

IL-generado por el compilador traduce el código en una llamada en el método estático, a pesar de que la sintaxis puede parecer una llamada en un método de instancia. Pero no es así, es una función estática, que no tiene acceso a los miembros privados de su objeto.

1
  1. Porque no hay una instancia para llamarlos.

  2. Creo que es para limitar el número de posibles errores si se ha declarado en la clase no estática.

  3. Dice su método de extensión. El compilador ve esto y permite usarlo en un tipo declarado como este, en lugar de como un método estático.

  4. La llamada al método de extensión es solo azúcar sintáctica. Esta llamada se convierte en llamada a método estático ordinario en IL.

1

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.

2

¿Por qué los métodos de extensión son estáticos?

Porque no puede modificar la clase para agregar métodos de instancia. Todo es azúcar sintáctico para hacer llamadas a estos métodos más agradables, nada más.

¿Por qué tienen que declararse en una clase estática?

Porque no estamos destinados a crear instancias de la clase. Es una decisión de diseño. ¿Por qué complicar cosas como tener instancias de alguna clase que tenga métodos de extensión adjuntos que ni siquiera podrían ser utilizables?

¿Qué indica esta palabra clave en la lista de parámetros del método de extensión? Como es una clase estática, ¿cómo funciona la palabra clave "this" en este contexto?

Es un método estático. this no tiene ningún significado en este contexto. El this en la firma es solo una forma de indicar que se está declarando un método de extensión.

¿Cómo ocurre la asignación de memoria para este tipo de métodos?

Confundido acerca de esto. Todos son métodos estáticos en una clase estática. Se "asignan" como cualquier otro método (estático), solo hay una copia del código para el tipo.

Cuestiones relacionadas