2010-08-25 16 views
6

¿Cómo entender el siguiente código? ¿Qué significa "esto" en el prototipo de la función genérica? ¡Gracias!C# función genérica pregunta

public static class MyExtensions 
{ 
    public static MyStream<T> MySingle<T>(this T source) 
    { 
     return new MyStream<T>(source); 
    } 
} 

Respuesta

7

Que es una extension method, que se convierte en un método válido de todos los objetos de tipo T.

No tiene nada que ver con los genéricos.

+3

Buen punto acerca de la palabra clave 'this' que no está relacionada con los genéricos. – Oded

16

this en este contexto significa que es un método de extensión por lo que puede usarlo de la manera "normal":

MyExtensions.MySingle(someSource)

o de esta manera (a veces mejor):

someSource.MySingle()

Esto solo es posible cuando el método es static y está en una clase static. Además, no tiene nada que ver con el aspecto genérico del método: puede hacer métodos de extensión sin aspectos genéricos y todavía tiene el this frente al parámetro.

Los métodos de extensión, como su nombre lo sugiere, se usan para extender clases ya existentes con métodos si no tiene acceso a la fuente o si desea que se use en un amplio conjunto de clases. Es importante tener en cuenta que no tiene acceso a métodos privados y protegidos, etc., como cuando deriva de la clase, cuando crea un método de extensión en un tipo.

También, para una explicación en profundidad:

Extension Methods (C# Programming Guide)

1

Este es un método de extensión, this es la instancia que se aplica el método a.

0

Esto indica que es un método de extensión. El tipo que se extiende es 'T'. Todas las instancias de 'T' tendrán el método MySingle.

2

MySingle<T> se define como extension method (MSDN).

Esto significa que en el uso se le puede llamar así:

MyStream<string> stringStream = "a string".MySingle(); 

Esto es idéntico a llamar a él de la manera "estándar":

MyExtensions.MySingle("a string"); 

Cuando se llama a que la primera forma (como método de extensión), el elemento al que se llama se pasa como el primer parámetro. Por lo tanto, el tipo del primer parámetro define el tipo al que se puede llamar el método de extensión, pero como tiene un tipo genérico abierto, puede invocarse sobre cualquier objeto.

Para definir un método de extensión, la clase que lo contiene y el método en sí deben declararse static.

Se agregaron métodos de extensión en C# 3.0 y VB 9.0.

1

Sí, es un método de extensión pero, por lo que yo sé, también se pregunta qué significa utilizar una T (definición de tipo genérico) con la palabra clave "this" en la firma del método.

Significa que el método de extensión será un método válido para todos los objetos de todas las clases y tipos de estructuras de su proyecto.