Pergunta

Entendo perfeitamente o conceito de árvores de expressão, mas estou tendo dificuldade em encontrar situações em que elas sejam úteis.Existe uma instância específica em que as árvores de expressão podem ser aplicadas?Ou é útil apenas como mecanismo de transporte de código?Sinto que estou faltando alguma coisa aqui.Obrigado!

Foi útil?

Solução

Ou é útil apenas como mecanismo de transporte de código?

É útil como mecanismo de execução para código.Usando o padrão de intérprete, as árvores de expressão podem ser interpretadas diretamente.Isso é útil porque é muito fácil e rápido de implementar.Esses intérpretes são onipresentes e usados ​​mesmo em casos que parecem não “interpretar” nada, por ex.para imprimir estruturas aninhadas.

Outras dicas

Algumas estruturas de simulação de teste unitário fazem uso de árvores de expressão para configurar expectativas/verificações fortemente tipadas.Ou seja:

myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
                                              // SomeMethod was called with 
                                              // someObject as the argument

Aqui, a expressão nunca é realmente executada, mas a própria expressão contém informações interessantes.A alternativa sem árvores de expressão seria

myMock.Verify("SomeMethod", someObject) // we've lost the strong typing

As árvores de expressão são úteis quando você precisa acessar a lógica da função para alterá-la ou reaplicá-la de alguma forma.

Linq to SQL é um bom exemplo:

//a linq to sql statement
var recs (
    from rec in LinqDataContext.Table
    where rec.IntField > 5
    select rec );

Se não tivéssemos árvores de expressão, esta instrução teria que retornar todos os registros e, em seguida, aplicar a lógica where do C# a cada um.

Com árvores de expressão que where rec.IntField > 5 pode ser analisado em SQL:

--SQL statment executed
select *
from [table]
where [table].[IntField] > 5
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top