Quarta-feira, 28 de maio de 2008 às 10h00

As novidades do C# 3.0 - Parte 02

Faltam -1 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

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

Os 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, inicialmente precisamos saber que o funcionamento dos métodos é semelhante aos métodos estáticos, e dessa forma 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, como mostrado abaixo:

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âmetr,o 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:

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:

Variavel = 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.

Variavel = 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!

3 comentários

 René Bizelli de Oliveira
30/05/2008 16h52

Valor.ConvertInt32Ext() ?

Olá Adriano,

Eu não entendi como a variável Valor "enxergou" o método ConvertInt32Ext() .. pode explicar isso?!

Obrigado...

 Adriano Bertucci
30/05/2008 17h37

Ola René,
Repare que na classe "ExtMethods", temos o métodos que a variavel "enxergou", o "ConvertInt32Ext", ele o fica ativo na variavel por dois motivos, primeiro pelo fato de a classe e o método serem estaticos. Segundo graças ao c# 3.0 ao colocar o termo "this" na frente do parametro requirido no metodo, este termo faz com que toda variavel do mesmo tipo do parametro criado na aplicação apareça o metodo criado, como se ele incorporace o metodo na classe "string" da variavel.

Não sei se fui claro caso não tenha entendido me avise tento te explicar melhor!

[]'s

 Fábio Sanches Carmona
02/12/2008 14h42

Matérias

Adriano,
Gostaria de saber quando teremos novas matérias suas sobre C#.

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Adriano Bertucci é desenvolvedor de trabalha com arquitetura de softwares há sete anos, sendo que .NET desde 2002. Líder do grupo Build Brasil. Membro do Board INETA 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.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.