Eu me deparei com várias instâncias do código C # como o seguinte:
public static int Foo(this MyClass arg)
Não consegui encontrar uma explicação sobre o que a this
palavra - chave significa neste caso. Alguma ideia?
Eu me deparei com várias instâncias do código C # como o seguinte:
public static int Foo(this MyClass arg)
Não consegui encontrar uma explicação sobre o que a this
palavra - chave significa neste caso. Alguma ideia?
Respostas:
Este é um método de extensão . Veja aqui uma explicação .
Os métodos de extensão permitem que os desenvolvedores adicionem novos métodos ao contrato público de um tipo existente de CLR, sem precisar subclassificá-lo ou recompilar o tipo original. Os métodos de extensão ajudam a mesclar a flexibilidade do suporte à "digitação de pato", popular em idiomas dinâmicos hoje em dia, com o desempenho e a validação em tempo de compilação de idiomas com tipos fortes.
Os métodos de extensão permitem uma variedade de cenários úteis e ajudam a tornar possível a estrutura de consulta LINQ realmente poderosa ....
isso significa que você pode ligar
MyClass myClass = new MyClass();
int i = myClass.Foo();
ao invés de
MyClass myClass = new MyClass();
int i = Foo(myClass);
Isso permite a construção de interfaces fluentes, conforme indicado abaixo.
A publicação de Scott Gu citada no blog explica muito bem.
Para mim, a resposta para a pergunta está na seguinte declaração nesse post:
Observe como o método estático acima tem uma palavra-chave "this" antes do primeiro argumento de parâmetro do tipo string. Isso informa ao compilador que esse método de extensão específico deve ser adicionado aos objetos do tipo "string". Na implementação do método IsValidEmailAddress (), eu posso acessar todas as propriedades / métodos / eventos públicos da instância real da string em que o método está sendo chamado e retornar verdadeiro / falso, dependendo de ser um email válido ou não.
this
palavra - chave na assinatura do método. As outras respostas dizem apenas inútil "é um método de extensão". Eu nunca entendi completamente como os métodos de extensão "se ligam" aos tipos que eles estendem até ler esta resposta. Obrigado!
Além da explicação de Preet Sangha: O
Intellisense exibe os métodos de extensão com uma seta azul (por exemplo, na frente de "Agregar <>"):
Você precisa de um
using the.namespace.of.the.static.class.with.the.extension.methods;
para que os métodos de extensão apareçam e estejam disponíveis, se estiverem em um espaço para nome diferente do código que os está usando.
Eles são métodos de extensão . Bem-vindo a todo um mundo fluente . :)
Eu mesmo aprendi isso outro dia: a palavra-chave this define que o método está sendo uma extensão da classe que o segue. Portanto, para o seu exemplo, o MyClass terá um novo método de extensão chamado Foo (que não aceita nenhum parâmetro e retorna um int; pode ser usado como em qualquer outro método público).
"this" estende a próxima classe na lista de parâmetros
Portanto, na assinatura do método abaixo "this" estende "String". Linha é passada para a função como um argumento normal para o método sequência estática pública [] SplitCsvLine (esta linha de sequência)
No exemplo acima, a classe "this" está estendendo a classe "String" incorporada.