Esta é a sintaxe para declarar métodos de extensão, um novo recurso do C # 3.0.
Um método de extensão é parte código, parte compilador "mágico", onde o compilador com a ajuda do intellisense no Visual Studio faz parecer que seu método de extensão está realmente disponível como um método de instância no objeto em questão.
Deixe-me dar um exemplo.
Não há método na classe String chamado GobbleGobble, então vamos criar um método de extensão:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
O nome da classe é apenas minha convenção de nomenclatura, não é necessário nomeá-la assim, mas deve ser estática, assim como o método.
Depois de declarar o método acima, você pode, no Visual Studio, digitar o seguinte:
String s = "Turkey Baster!";
s.
após o ponto, espere pelo intellisense e observe que há um método GobbleGobble ali, complete o código assim:
String s = "Turkey Baster!";
s.GobbleGobble();
Importante : A classe onde o método de extensão é declarado deve estar disponível para o compilador e o processador do intellisense para que o intellisense mostre o método. Se você digitar GobbleGobble manualmente e usar o atalho Ctrl+ ., isso não o ajudará a acertar o uso de diretivas no arquivo.
Observe que o parâmetro para o método desapareceu. O compilador moverá silenciosamente os bits importantes, que são:
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
Assim, o código acima será transformado pelo compilador para este:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Portanto, no momento da chamada, não há nada de mágico nisso, é apenas uma chamada para um método estático.
Observe que se o seu método de extensão declara mais de um parâmetro, apenas o primeiro suporta o this
modificador, e o resto deve ser especificado como parte da chamada do método normalmente:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Os métodos de extensão foram adicionados em parte devido ao Linq, onde a sintaxe Linq do C # procurará métodos de extensão nomeados apropriadamente para os objetos em jogo, o que significa que você pode "introduzir" o suporte ao Linq em qualquer tipo de classe apenas declarando a extensão correta métodos. Obviamente, o suporte completo ao Linq dá muito trabalho, mas é possível.
Além disso, os métodos de extensão por si só são realmente úteis, então leia sobre isso.
Aqui estão alguns links: