Mostrando postagens com marcador Dynamic Programming. Mostrar todas as postagens
Mostrando postagens com marcador Dynamic Programming. Mostrar todas as postagens

Um método pode retornar um tipo anônimo?

Os tipos anônimos (Anonymous Types) são uma característica da linguagem C# onde criamos diversas propriedades para um objeto sem ter que definir explicitamente seu tipo. Essa novidade surgiu na versão 3.0 junto com diversas outras tais como: propriedades automáticas, inferência de tipos, inicializadores de objetos, expressões lambda, métodos de extensão e outros.

Um tipo anônimo pode ser declarado da seguinte maneira:

var c = new { Nome = "Ari", Idade = 28 };

Neste caso a variável c é um tipo de possui duas propriedades: uma propriedade do tipo System.String chamada Nome e uma propriedade do tipo System.Int32 chamada Idade.

Os tipos anônimos são muito úteis quando realizamos consultas usando o LINQ pois normalmente temos que retornar um tipo com um conjunto de propriedades diferente dos tipos já existentes. Por exemplo, vejam as duas consultas abaixo:

var q1 = from c in dc.Customers
         where c.City == "London"
         select new { c.FirstName, c.LastName, c.City };

var q2 = from c in dc.Customers
         where c.City == "London"
         select new { c.FirstName, c.City };

A primeira consulta retorna um tipo que contém 3 propriedades (FirstName, LastName e City) e a segunda um tipo com 2 propriedades (FirstName e City). Sem os tipos anônimos teríamos que definir explicitamente duas classes para representar os tipos retornados.

Mas, se o tipo é anônimo, como podemos fazer para um método retorná-lo?

public ???? ListCustomers()
{
    var q1 = from c in dc.Customers
             where c.City == "London"
             select new { c.FirstName, c.LastName, c.City };

    return q1;
}

Bom, podemos resolver essa questão pensando da seguinte maneira: se um tipo anônimo é um tipo do .NET, então esse herda de System.Object, vamos então retornar um object.

public object ListCustomers() { ... }

Esse raciocínio está correto, o problema é que transformando para object perdemos a possibilidade de utilizarmos as propriedades do tipo anônimo diretamente (strong typing).

var c = ListCustomers();
c.FirstName = "Anders"; // erro

Bom, para resolver esse problema temos 3 possíveis soluções:

  1. Reflection.
  2. Dynamic Programming.
  3. Realizar um cast do object com o tipo anônimo.

A primeira opção é lenta e muito código deve ser criado, portanto será descartada. A segunda opção é interessante mas vou limitar meu escopo com as versões anteriores à 4.0. Vou mostrar então a terceira opção.

Para realizarmos um cast de um object para um tipo anônimo podemos, com auxílio de Generics, criar o método abaixo:

public T CastObjectToType<T>(object objeto, T tipo)
{
    return (T)objeto;
}

Podemos então converter o objeto em um tipo anônimo da seguinte maneira:

object o = ListCustomers();
var c = CastObjectToType(o, new { FirstName = String.Empty, 
                                  LastName = String.Empty, 
                                  City = String.Empty});
c.FirstName = "Anders";  // OK

Isso é possível graças à inferência de tipo, que nos permite fazer um cast sem conhecer o nome do tipo. É o que foi realizado no método CastObjectToType.

Finalizado, a resposta é SIM. Podemos retornar um tipo anônimo de um método.

Links de ajuda:

Anonymous Types (C# Programming Guide)
http://bit.ly/69HYJd

Generic Methods (C# Programming Guide)
http://bit.ly/6wFbas

Getting Started with LINQ in C#
http://bit.ly/4BOIUU

Must-Watch Videos – Anders Hejlsberg

Todo mundo já ouviu falar de role-model? É uma pessoa que serve de exemplo de comportamento. No mundo profissional, o meu role-model é Anders Hejlsberg.

anders Anders Hejlsberg (nome complicado de pronunciar e escrever) é Microsoft Technical Fellow e criador de ferramentas de desenvolvimento e linguagens de programação. Ele é também chief designer da linguagem C# e um dos principais participantes no desenvolvimento do .NET Framework.

Antes de trabalhar com C# e com o .NET Framework, Hejsberg foi o arquiteto de desenvolvimento do Visual J++ e do Windows Foundation Classes.

Hejlsberg foi um dos primeiros empregados da Borland e foi o autor original do Turbo Pascal, uma IDE revolucionária (era muito bom) e também chief architect do Delphi.

Na minha opinião, os feitos desse gênio modificaram a maneira com que trabalhamos com Frameworks e linguagens de programação.

Vou enumerar abaixo alguns dos vídeos que acredito serem obrigatórios para conhecer essa “figura”.  Os vídeos, além de mostrar a geniosidade de Anders, também é muito útil para entender conceitos sobre Generics, LINQ e Dynamic Programming.

1 - MSDN TV: Whiteboard with Anders Hejlsberg

No evento Tech-Ed de 2004 Anders responde as questões de alguns desenvolvedores e escreve alguns exemplos em um quadro. É interessante perceber a qualidade das perguntas e a maneira simples com que Hejlsberg as responde. Diversos assuntos são comentados, incluindo: generics, herança múltipla, parâmetros opcionais e outros.

É interessante perceber que na época ele não achava que os parâmetros opcionais, agora presentes no C# 4.0, seriam necessários, visto que podemos sobrecarregar métodos.

Link: http://bit.ly/4Z2qLe (Tamanho: 153MB)

2 – Channel 9: LINQ

Em um papo descontraído Anders fala sobre o LINQ, que é um conjunto de extensões para o .NET Framework que engloba operações de consulta, projeção e transformação integradas às linguagens. O LINQ foi uma inovação e tanto e também alterou a maneira de escrevermos código que realizam acesso a dados.

Data != Objects ? Com LINQ não !

Link: http://bit.ly/4AwCTg (Streaming)

3 – MSDN Spotlight: .NET Language Integrated Query (LINQ) Framework Overview

Esse vídeo é uma apresentação no Tech-Ed de 2007 e apesar de possuir alguns assuntos semelhantes ao vídeo #2 contém também explicações sobre o LINQ Framework, que inclui: LINQ to Objects, LINQ to Datasets, LINQ to SQL, LINQ to Entities e LINQ to XML.

Alguns demos sobre LINQ to Objects, LINQ to SQL e LINQ to XML são demonstrados. Vale a pena conferir.

Link: http://bit.ly/5sCNIe (Streaming)

4 – Channel 9: Future of C#

Esse é um dos meus vídeos favoritos e é uma apresentação no PDC de 2008 e que mostra a inclusão de Dynamic Programming no C#, parâmetros opcionais, compilador como um serviço e também a idéia de co-evolução entre as linguagens C# e VB.NET.

Link: http://bit.ly/6Tqq2k (Streaming)

Obs: No PDC de 2009 o Luca Bolognesi, responsável pelas linguagens C#, VB.NET e F# fez uma apresentação basicamente mostrando os mesmo assuntos. É um outro vídeo bem interessante.

Link: http://bit.ly/6FSA1X (Streaming)

Espero que gostem.