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

He encontrado varias instancias de código C # como las siguientes:

public static int Foo(this MyClass arg) 

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

Este es un método de extensión . Mira 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 de CLR existente, sin tener que subclasificarlo o recomstackr el tipo original. Los métodos de extensión ayudan a combinar la flexibilidad del soporte “tipado de pato” popular en los lenguajes dynamics actuales con el rendimiento y la validación en tiempo de comstackción de los 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.

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

Para mí, la respuesta a la pregunta está en la siguiente statement 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 comstackdor que este Método de Extensión particular se debe agregar 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 en la que se llama al método, y devolver verdadero / falso dependiendo de si es un correo electrónico válido o no.

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

enter image description here

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 nombre diferente al código que los usa.

Son métodos de extensión . Bienvenido a un nuevo mundo fluido . 🙂

Lo aprendí el otro día: la palabra clave define que el método es 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 cualquier otro método público).

“this” 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 para el método. cadena estática pública [] SplitCsvLine (esta línea de cadena)

En el ejemplo anterior, “this” class está ampliando la clase “String” incorporada.