Uso da palavra-chave "this" em parâmetros formais para métodos estáticos em C #

286

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 thispalavra - chave significa neste caso. Alguma ideia?

kpozin
fonte
10
Além da resposta aceita, para os métodos de extensão C #, é necessário consultar a documentação oficial do MSDN .
corvo vulcan
4
Os métodos de extensão são convenientes, mas devemos ter cuidado ao criar / usá-los - eles podem quebrar! Cite as Diretrizes Gerais na documentação oficial do MSDN : "Em geral, recomendamos que você implemente métodos de extensão com moderação e somente quando necessário. ... Ao usar um método de extensão para estender um tipo cujo código-fonte não pode ser alterado, você corre o risco de que uma alteração na implementação do tipo faça com que seu método de extensão seja interrompido. "
21415 Krishna Gupta
Isso significa que isso seria possível? Porque é isso que estou procurando.
precisa

Respostas:

274

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.

Preet Sangha
fonte
sub-classing é difícil
Gerry
@Gerry - o que você quer dizer?
Preet Sangha
9
Desculpe, um pouco de sarcasmo - hoje em dia, muita sintaxe parece resolver problemas que eu nem sabia que eram problemas. A legibilidade deve ser uma prioridade muito alta.
Gerry
2
Para ser honesto @Gerry, parece que você está em um clássico Blub Paradox . Atualmente, muita sintaxe resolve problemas que você não está tendo, porque não sabia que havia uma maneira melhor ou não está realizando o tipo de tarefa para a qual essa sintaxe é incrível. A maioria dos comentários sobre ' esta é uma solução em busca de um problema ' é na verdade um exemplo de ' não sei como esse recurso funciona, portanto deve ser inútil '.
Myrddin Emrys
53

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.

James Wiseman
fonte
9
Essa deve ser a resposta aceita. É a única resposta que realmente explica qual é o objetivo real da thispalavra - 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!
Lews Therin
13

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 <>"):

insira a descrição da imagem aqui

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.

Olivier Jacot-Descombes
fonte
4

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).

jpoh
fonte
1

"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.

dcarl661
fonte