Mostrando postagens com marcador C#. Mostrar todas as postagens
Mostrando postagens com marcador C#. 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.