Como os tipos anônimos devem ser usados em C#?
-
09-06-2019 - |
Pergunta
Já vi muitas descrições de como funcionam os tipos anônimos, mas não tenho certeza de como eles são realmente úteis.Quais são alguns cenários que tipos anônimos podem ser usados para resolver em um programa bem projetado?
Solução
Os tipos anônimos não têm nada a ver com o design de sistemas ou mesmo com o nível de classe.Eles são uma ferramenta para os desenvolvedores usarem durante a codificação.
Eu nem trato os tipos anônimos como tipos em si.Eu os uso principalmente como tuplas anônimas em nível de método.Se eu consultar o banco de dados e depois manipular os resultados, prefiro criar um tipo anônimo e usá-lo, em vez de declarar um tipo totalmente novo que nunca será usado ou conhecido fora do escopo do meu método.
Por exemplo:
var query = from item in database.Items
// ...
select new { Id = item.Id, Name = item.Name };
return query.ToDictionary(item => item.Id, item => item.Name);
Ninguém se importa com `a, o tipo anônimo.Está lá para que você não precise declarar outra classe.
Outras dicas
Do LINQ em ação (página 76, seção 2.6.3):
...tipos anônimos [são] uma ótima ferramenta para resultados temporários rápidos e simples.Não precisamos declarar classes para manter resultados temporários graças aos tipos temporários.
basicamente eles são úteis para reter informações temporariamente no escopo local.Qualquer coisa a mais requer o uso de reflexão e pode se tornar um grande problema.O exemplo que eles dão no livro citado acima é escrito para consolar o id, o nome e a quantidade de memória ocupada por cada processo em execução.Eles criam um tipo anônimo, adicionam-no a uma lista (todas em uma instrução) e então usam ObjectDumper para produzi-lo.Portanto, o código não precisa mais de uma classe declarada separadamente para conter o ID, o nome e a memória usados, mas tudo é declarado implicitamente, reduzindo a contagem de linhas para 4:
var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);
O uso mais popular de tipos anônimos é para especificar projeções em uma consulta LINQ to SQL.
Esta consulta
from x in db.Table1 select new {x.Column1, Alias2=x.Column2}
será convertido para este SQL:
SELECT Column1, Column2 AS Alias2 FROM Table1
Com tipos anônimos, você pode criar projeções ad hoc sem definir previamente o tipo.O compilador definirá o tipo para você.
Quando você cria tipos para fins de 'Usar e lançar'.Isso parece ter acontecido devido ao LINQ.Parece ser uma maneira de criar estruturas com campos dinamicamente para uma consulta LINQ.Retornando uma estrutura/tipo apenas com campos especificados.Se não fosse por isso, você teria que declarar um tipo .Net para cada combinação exclusiva de campos que deseja recuperar.
Use-os com Linq.
É importante saber que o LINQ não obriga você a usar tipos anônimos.Você também pode escrever construções normais de objetos após a seleção.
var query = from item in database.Items
// ...
select new Person(item.id, item.Name)
Isso evita uma programação de reflexão feia.
@Wouter:
var query = from item in database.Items
select new Person
{
ID =item.id,
NAME= item.Name
};
onde ID e NAME são propriedade da sua classe Person.