Uso de la palabra clave "this" en parámetros formales para métodos estáticos en C #

286

Me he encontrado con varias instancias de código C # como el siguiente:

public static int Foo(this MyClass arg)

No he podido encontrar una explicación de lo que thissignifica la palabra clave en este caso. Alguna idea?

kpozin
fuente
10
Además de la respuesta aceptada, para los métodos de extensión de C # se debe consultar la documentación oficial de MSDN .
cuervo vulcano
44
Los métodos de extensión son convenientes, pero debemos tener cuidado al crearlos / usarlos, ¡pueden romperse! Cita de las Pautas generales en la documentación oficial de MSDN : "En general, recomendamos que implemente los métodos de extensión con moderación y solo cuando sea necesario ... Al usar un método de extensión para extender un tipo cuyo código fuente no puede cambiar, usted corre el riesgo de que un cambio en la implementación del tipo haga que su método de extensión se rompa ".
Krishna Gupta
¿Eso significa que esto sería posible? Porque eso es lo que estoy buscando.
facepalm42

Respuestas:

274

Este es un método de extensión . Ver aquí para una explicación .

Los métodos de extensión permiten a los desarrolladores agregar nuevos métodos al contrato público de un tipo CLR existente, sin tener que subclasificarlo o recompilar el tipo original. Los métodos de extensión ayudan a combinar la flexibilidad del soporte de "tipeo de pato" popular en los lenguajes dinámicos de hoy en día con el rendimiento y la validación en tiempo de compilación de lenguajes fuertemente tipados.

Los métodos de extensión permiten una variedad de escenarios útiles y ayudan a hacer posible el marco de consulta LINQ realmente poderoso ....

significa que puedes llamar

MyClass myClass = new MyClass();
int i = myClass.Foo();

más bien que

MyClass myClass = new MyClass();
int i = Foo(myClass);

Esto permite la construcción de interfaces fluidas como se indica a continuación.

Sangha Preet
fuente
subclasificar es difícil
Gerry
@Gerry: ¿qué quieres decir?
Saludo Sangha
9
Lo siento, un poco de sarcasmo: mucha sintaxis en estos días parece resolver problemas que ni siquiera sabía que eran problemas. La legibilidad debe ser una prioridad muy alta.
Gerry
2
Para ser honesto @Gerry, parece que estás en una clásica paradoja de Blub . Una gran cantidad de sintaxis en estos días resuelve los problemas que no tienes porque no sabías que había una mejor manera o no estás haciendo el tipo de tarea para la que esta sintaxis es increíble. La mayoría de los comentarios sobre ' esta es una solución en busca de un problema ' son en realidad un ejemplo de ' No sé cómo funciona esa característica, por lo que debe ser inútil '.
Myrddin Emrys
53

La publicación de blog citada de Scott Gu lo explica muy bien.

Para mí, la respuesta a la pregunta está en la siguiente declaración en esa publicación:

Observe cómo el método estático anterior tiene una palabra clave "this" antes del primer argumento de parámetro de tipo string. Esto le dice al compilador que este método de extensión en particular debe agregarse a los objetos de tipo "cadena". Dentro de la implementación del método IsValidEmailAddress (), puedo acceder a todas las propiedades / métodos / eventos públicos de la instancia de cadena real a la que se llama el método, y devolver verdadero / falso dependiendo de si es un correo electrónico válido o no.

James Wiseman
fuente
9
Esta debería ser la respuesta aceptada. Es la única respuesta que realmente explica cuál es el propósito real de la thispalabra clave en la firma del método. Las otras respuestas solo dicen inútilmente "es un método de extensión". Nunca entendí completamente cómo los métodos de extensión se "asocian" a los tipos que se extienden hasta leer esta respuesta. ¡Gracias!
Lews Therin
13

Además de la explicación de Preet Sangha:
Intellisense muestra los métodos de extensión con una flecha azul (por ejemplo, frente a "Agregado <>"):

ingrese la descripción de la imagen aquí

Tu necesitas un

using the.namespace.of.the.static.class.with.the.extension.methods;

para que los métodos de extensión aparezcan y estén disponibles, si están en un espacio de nombres diferente del código que los usa.

Olivier Jacot-Descombes
fuente
4

Acabo de aprender esto el otro día: la palabra clave this define que el método ha sido una extensión de la clase que lo sigue. Entonces, para su ejemplo, MyClass tendrá un nuevo método de extensión llamado Foo (que no acepta ningún parámetro y devuelve un int; puede usarse como con cualquier otro método público).

jpoh
fuente
1

"esto" extiende la siguiente clase en la lista de parámetros

Entonces, en la firma del método debajo de "this" se extiende "String". La línea se pasa a la función como un argumento normal al método. cadena estática pública [] SplitCsvLine (esta línea de cadena)

En el ejemplo anterior, esta clase "this" está extendiendo la clase integrada "String".

dcarl661
fuente