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 this
significa la palabra clave en este caso. Alguna idea?
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 this
significa la palabra clave en este caso. Alguna idea?
Respuestas:
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.
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.
this
palabra 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!
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 <>"):
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.
Son métodos de extensión . Bienvenido a un mundo completamente nuevo y fluido . :)
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).
"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".