2010-04-04 12 views
14

quiero preguntar por qué usamos palabra "this" antes de que el parámetro en un método de extensión (lenguaje C#) ........... como esta función:¿Por qué usamos "esto" en los Métodos de extensión?

public static int ToInt(this string number) 
    { 
     return Int32.Parse(number); 
    } 

Sé que tenemos que usarlo, pero no sé por qué.

+1

Hubiera preferido personalmente un Atributo. Algo así como [Extiende (typeof (foo)] y luego tenía una variable implícita llamada valor, similar a las propiedades. Hubiera sido más expresivo y no requería una reutilización de una palabra clave existente. Solo mi opinión personal. – John

+0

Scott Hanselman tiene una buena artículo que explica la importancia de la palabra clave "this". http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx – Zaffiro

Respuesta

9

Porque esa es la forma en que le dice al compilador que es un método de extensión en primer lugar. De lo contrario, es solo un método estático normal. Supongo que eligieron this, por lo que no tuvieron que inventar una nueva palabra clave y potencialmente descifrar el código anterior.

+1

Y por lo tanto no es necesario etiquetar el método con ExtensionAttribute como lo hace en VB.Net. –

+2

C# tiene azúcar sintáctica más deliciosa, y es por eso que me encanta. –

0

Para identificar el método como método de extensión. ¿De qué otro modo sabría el compilador?

1

Simplemente lo marca como un método de extensión, este es el formato que eligieron para definir el método como un método de extensión, a diferencia de un método estático simple (que es como se llama internamente de todos modos). Esto es solo para el compilador (y intellisense), debajo de las cubiertas su código compila lo mismo que si estuviera llamando directamente al método estático.

Esta definición de un método:

public static int ToInt(string number) //non extension 

necesarias para ser distinguible de esto:

public static int ToInt(this string number) //extension 

De lo contrario, tendríamos IntelliSense contiene todos los métodos estáticos en una clase estática en espacios de nombres incluidos, muy indeseable.

1

Principalmente porque es la forma en la C# spec define un método de extensión. Ver Sección 10.6.9

10.6.9 Los métodos de extensión

Cuando el primer parámetro de un método incluye la este modificador, que método se dice que es un método de extensión . Los métodos de extensión solo pueden ser declarados en clases estáticas no genéricas, no anidadas . El primer parámetro de un método de extensión no puede tener modificadores que no sean este, y el tipo de parámetro no puede ser un tipo de puntero .

6

Para información, la importancia de this como contextual palabra clave aquí es en gran medida en que evita la introducción de una nueva palabra clave. Cada vez que introduce una palabra clave nueva, corre el riesgo de romper el código que la habría utilizado como nombre de variable/tipo.this tiene algunas características útiles:

  • Es suficiente a lo que indica que esto se relaciona con un método de instancia
  • es una palabra clave existente ...
  • ... que habría sido ilegal cerca cuando se utiliza en ese lugar

Esto significa que no código existente se romperá.

Más allá de la elección de this como la palabra clave, es simplemente una sintaxis conveniente para el compilador, y más conveniente que agregar [Extension] manualmente. Sin embargo, sería un método estático, sin ningún tipo de comportamiento especial.

Cuestiones relacionadas