Desenvolvimento - C#

C# 3.0 – Novidade – Parte 2 - Extension Methods (Métodos de Extensão)

Neste artigo que é a parte 2 da série C# 3.0 - Novidades iremos falar sobre Extension Methods.

por Adriano Bertucci



Dando continuidade a nossa série, vamos falar de um dos novos recursos com maior expressão na linguagem e no .NET 3.5,  a possibilidade de criar métodos de extensão (extension methods).

Extension Methods, são métodos estáticos que podemos utilizar para estender funcionalidades de classes especificas do .NET.

Declarando um Extension Method

Para declararmos novos métodos de extensão, primeiro precisamos saber que o funcionamento dos métodos é semelhante aos métodos estáticos, portanto, você só pode declará-los em classes estáticas.  Segundo, sempre que formos declarar um extension method, vamos especificar a palavra-chave this como primeiro parâmetro do método. Vamos ver um exemplo:



namespace ExtensionMethods

{

    public static class ExtMethods

    {

        //Static Method - Maneira tradicional

        public static int ConvertInt32Static(string s)

        {

            return Int32.Parse(s);

        }

        //Extension Method - Nova funcionalidade

        public static int ConvertInt32Ext(this string s)

        {

            return Int32.Parse(s);

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            //Valor

            string Valor = "9";

            //Executando um extension method

            int ExtMethod = Valor.ConvertInt32Ext();

           

            //Excutando um Static Method

            int StaticMethod = ExtMethods.ConvertInt32Static(Valor);

            //Exibe os valores

            Console.WriteLine("Extension Method: " + ExtMethod);

            Console.WriteLine("Static Method: " + StaticMethod);

            Console.ReadLine();

        }

    }

}

Podemos notar no exemplo a diferença de comportamento entre um método estático e o novo extension method. Repare que devido a declaração da palavra this antes do parâmetro do método de extensão, o .NET Framework “incorporou”  o método à classe string. Podemos notar a presença mais exata do método extensivo na classe através IntelliSense, com mostrado abaixo:


01.png

Agora vamos enumerar as diferenças entre os métodos estáticos (Static Methods) e os métodos de extensão (Extension Methods):

· Para declaração de métodos de extensão (Extension Methods) precisamos declarar antes do primeiro parâmetro a palavra-chave this. Já para os métodos estáticos (Static Methods) não temos a palavra.

· Quando consumimos um método de extensão, o parâmetro declarado no método é omitido, como podemos notar no primeiro exemplo. No método estático precisamos especificar o valor como parâmetro.

· Métodos de Extensão só podem ser declarados em classes estáticas, o que não é exigência para métodos estáticos.

Trabalhando por dentro do IL

Se formos olhar e analisar o IL gerado pela aplicação mostrada no exemplo 1 temos a seguinte informação:

02.png

Abaixo temos o código IL do método de extensão o ConvertInt32Ext.

.method public hidebysig static int32  ConvertInt32Ext(string s) cil managed

{

  .custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )

  // Code size       12 (0xc)

  .maxstack  1

  .locals init ([0] int32 CS$1$0000)

  IL_0000:  nop

  IL_0001:  ldarg.0

  IL_0002:  call       int32 [mscorlib]System.Int32::Parse(string)

  IL_0007:  stloc.0

  IL_0008:  br.s       IL_000a

  IL_000a:  ldloc.0

  IL_000b:  ret

} // end of method ExtMethods::ConvertInt32Ext

Podemos notar no código grifado de vermelho a presença do atributo no método declarando-o como extension method.

E agora o código IL do método estático ConvertInt32Static.


.method public hidebysig static int32  ConvertInt32Static(string s) cil managed

{

  // Code size       12 (0xc)

  .maxstack  1

  .locals init ([0] int32 CS$1$0000)

  IL_0000:  nop

  IL_0001:  ldarg.0

  IL_0002:  call       int32 [mscorlib]System.Int32::Parse(string)

  IL_0007:  stloc.0

  IL_0008:  br.s       IL_000a

  IL_000a:  ldloc.0

  IL_000b:  ret

} // end of method ExtMethods::ConvertInt32Static

Porque usar Extension Methods?

Bom, depois de tudo isso você pode estar se perguntando... Porque usar os métodos de extensão?

Simples, por absoluta conveniência.

Vamos explicar melhor , suponha que você tenha passado anos desenvolvendo um Framework com funções usuais no dia a dia e que você quis disponibilizar a classe para uso externo. Quando alguém quiser consumir alguma função dela o desenvolvedor necessitará conhecer o nome da classe completo para poder executar o método estático desejado, algo como no exemplo abaixo:



Varivel = MeuFramework.

Neste ponto teremos o IntelliSense  que lhe fornecerá todas as funções disponíveis, bastando você escolher a sua e fornecer os parâmetros necessários.

Varivel = MeuFramework.FuncaoDesejada(Valor);

Conclusão

Os extension methods nascem como um novo mecanismo para invocar métodos estáticos em objetos instanciados.

Até o próximo.

Adriano Bertucci

Adriano Bertucci - Trabalhando com Arquitetura e desenvolvimento de softwares a sete anos, sendo que .NET desde 2002. Líder do grupo Build Brasil. Atualmente trabalhando como líder de desenvolvimento em soluções para plataforma Microsoft. Membro do Board INETA, responsável pelo grupos no estado de SP, vem trabalhando a três anos na disseminação da plataforma .NET, através de treinamentos, palestras e reuniões, as quais já atingiram cerca de 8000 pessoas em todo Brasil. Speaker INETA Brasil e Culminis, Colunista do Portal de Vídeos Linha de Código e MSDN Brasil.
Blog:
www.adrianobertucci.com