В каких случаях деревья выражений полезны? - PullRequest
11 голосов
/ 26 августа 2008

Я полностью понимаю концепцию деревьев выражений, но мне трудно пытаться найти ситуации, в которых они полезны. Есть ли конкретный случай, в котором деревья выражений могут быть применены? Или это полезно только в качестве транспортного механизма для кода? Я чувствую, что здесь чего-то не хватает. Спасибо!

Ответы [ 3 ]

7 голосов
/ 26 августа 2008

Некоторые фреймворки для юнит-тестов используют деревья выражений для установки строго типизированных ожиданий / проверок. То есть:

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

Здесь выражение никогда не выполняется, но само выражение содержит интересную информацию. Альтернатива без деревьев выражений будет

myMock.Verify("SomeMethod", someObject) // we've lost the strong typing
6 голосов
/ 26 августа 2008

Или это полезно только в качестве транспортного механизма для кода?

Это полезно как механизм выполнения для кода. Используя шаблон интерпретатора , деревья выражений могут интерпретироваться напрямую. Это полезно, потому что это очень легко и быстро реализовать. Такие переводчики вездесущи и используются даже в тех случаях, когда кажется, что они ничего не «интерпретируют», например для печати вложенных структур.

4 голосов
/ 26 августа 2008

Деревья выражений полезны, когда вам нужен доступ к логике функции, чтобы каким-либо образом изменить или применить ее.

Хорошим примером является Linq to SQL:

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

Если бы у нас не было деревьев выражений, этот оператор должен был бы вернуть все записи, а затем применить логику C # where для каждой.

С деревьями выражений, которые where rec.IntField > 5 могут быть проанализированы в SQL:

--SQL statment executed
select *
from [table]
where [table].[IntField] > 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...