El uso de palabra “this” en los parámetros formales de los métodos estáticos en C #
-
21-08-2019 - |
Pregunta
Me he encontrado con varios casos de código C # como el siguiente:
public static int Foo(this MyClass arg)
No he sido capaz de encontrar una explicación de lo que significa la this
palabra clave en este caso. Cualquier ideas?
Solución
Este es un método de extensión . Ver aquí para una explicación .
Los métodos de extensión permiten a los desarrolladores añadir nuevos métodos para el público contrato de un tipo CLR existente, sin tener que subclase o recompilar el tipo original. Métodos de extensión ayudar a mezclar el flexibilidad de "duck typing" apoyo popular dentro de los lenguajes dinámicos hoy con la validación del rendimiento y tiempo de compilación de lenguajes de tipo fuerte.
Métodos de extensión permiten una variedad de escenarios útiles y ayudar a hacer la posible realmente potente marco consulta LINQ ....
que significa que se puede llamar
MyClass myClass = new MyClass();
int i = myClass.Foo();
en lugar de
MyClass myClass = new MyClass();
int i = Foo(myClass);
Esto permite la construcción de interfaces fluidas como se indica a continuación.
Otros consejos
blog citado de Scott Gu lo explica muy bien.
Para mí, la respuesta a la pregunta es la siguiente declaración en ese puesto:
Tenga en cuenta cómo el método estático anterior tiene una Palabra "this" antes de la primera argumento de parámetros de tipo cadena. Esto le dice al compilador que esta en particular Método de extensión debe ser añadido a objetos de tipo "cadena". Dentro del IsValidEmailAddress () implementación del método a continuación, que pueda acceder a todo el público propiedades / métodos / acontecimientos de la instancia cadena real que el método que se llama en adelante, y el regreso verdadero / falso dependiendo de si se trata de 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 "agregado <>"):
Se necesita un
using the.namespace.of.the.static.class.with.the.extension.methods;
para los métodos de extensión que aparecen y que estén disponibles, si se encuentran en un espacio de nombres diferente que el código de usarlos.
métodos de extensión . Bienvenido a un nuevo mundo fluidez . :)
Me acabo de enterar de esto mismo, el otro día: la palabra clave this define que el método ha de ser una extensión de la clase que se procede. Así, por tu ejemplo, MiClase tendrá un nuevo método de extensión llamado Foo (que no acepta ningún parámetro y devuelve un entero, sino que puede ser utilizado como con cualquier otro método público).
"este" se extiende la clase siguiente en la lista de parámetros
Así que en la firma del método de abajo "esto" se extiende "Cadena". Línea se pasa a la función como un argumento normal al método. public static string [] SplitCsvLine (esta línea de cuerda)
En el ejemplo anterior "este" clase está extendiendo el en clase construido "String".