Lambda e VAR no .NET 2.0    

Como primeiro artigo, vou mandar uma rápida curiosidade. Já tinha pensando a escrever sobre ela há um bom tempo, mas agora estou tendo a oportunidade. Espero que gostem!

Introdução

Muitas equipes devem desesperadamente pedir para seus gestores migrarem as aplicações para versões superiores do .NET Framework alegando que vão ter muito ganho em tempo de desenvolvimento, visto que novas funcionalidades adicionadas ao Framework vão agilizar o desenvolvimento de certas tarefas "chatas/repetidas" da fase de codificação.

Esse tipo de situação é muito constante em grandes empresas, onde a atualização dos ambientes de produção é muito burocrática, entre outros inúmeros motivos.

A seguir vou mostrar, para quem não sabe ainda, que apenas atualizando o ambiente de desenvolvimento (O Visual Studio basicamente) já pode resolver um bocado de problema.

Situação

Estava fazendo um protótipo de um sistema em ASP.NET esses dias, desenvolvendo tudo em .NET 3.5. Quando fui publicar o protótipo, descobri que o servidor que hospedaria esse protótipo tinha apenas a versão 2.0 do framework.

Por ser apenas um protótipo, não achei necessário migrar, visto que quem matinha o plano de hospedagem era o cliente, preferi deixar a burocracia para o momento da implantação.

 

Mudei o Target Framework do projeto para 2.0, retirei os using para os namespaces de Link, tirei as referencias para os assemblies do 3.5, alterei alguma coisa no Web.Config e pronto! Minha aplicação estava rodando no 2.0 como esperado.

O que me chamou a atenção foi depois perceber que a aplicação estava rodando normalmente com as Expressões Lambdas e codm a palavra chave var por todo o código, mesmo estando compilado e rodando em um servidor que só tem instalado o .NET 2.0.

Explicação

Perguntei-me o motivo disto acontecer e a resposta foi muito simples:

Tanto a palavra chave var como as expressões Lambdas são facilidades de linguagem apenas, ou seja, não são estruturas do .NET em si, mas operadores que mapeiam para estruturas mais complexas, assim como o int é mapeado no momento da compilação para System.Int32, e que o trabalho de entender isso fica a cargo do compilador, não do .NET

No momento da compilação, o compilador converte expressões lambdas para delegates comuns, e o tipo implicitado com o var é utilizado efetivamente para a geração do IL.

Desta forma, CLL nem percebe que o código foi gerado com Lambda ou VAR, pois o IL é o padrão do .NET 2.0.

Observação

Isto só funciona se você estiver utilizando o VS 2008 ou o VS 2010, pois quem "entende" as expressões Lambdas, a palavra-chave var entre outros "artefatos" adicionados a partir da versão 2008 do C#/VB.NET é o compilador, e o compilador utilizado pelo VS 2005, quando foi feito, não foi feito para saber traduzir esse tipo de funcionalidade. Quando você muda o "Target Framework" dentro do VS 2008/2010, a única coisa que muda no momento da compilação é a opção /langversion do compilador. O compilador determina se aquilo que ele entende (que para o compilador a partir do VS 2008 inclui Lambdas, var, etc) deve ser traduzido para a versão 2.0, 3.5 ou 4.0 do IL, que ai sim é lido pelo .NET Framework.

No VS 2005, o código não será nem compilado.

Evidenciando

O código no VS 2008/2010:

 

 

 

Compilado em .NET 2.0, depois de compilado, e utilizando o Red Gate's .NET Reflector, para ver como ele interpreta o IL, o resultado foi o seguinte:

 

 

 

Ou seja, utilizando um simples método anônimo.

Neste caso, o IL não mudará entre as versões 2.0 ou superior do .NET

Para quem não sabia, vale a curiosidade.

 

 

 

 

 

21. julho 2010 07:14 by Frederico | Comments (3) | Permalink

Sobre mim

Minha Imagem

Meu nome é Frederico Batista Emídio, trabalho com desenvolvimento de sistemas profissionalmente a oito anos, porém, já faço sites pessoais a pelo menos dez anos.

Para saber mais clique aqui.

Páginas

Calendário

<<  novembro 2017  >>
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Visualizar posts em um Calendário
Sigua @fredemidio

MCP Asp.NET