Я полностью понимаю концепцию деревьев выражений, но мне трудно найти ситуации, в которых они полезны. Есть ли конкретный экземпляр, в котором можно использовать деревья выражений? Или это полезно только в качестве транспортного механизма для кода? Я чувствую, что здесь что-то не хватает. Благодаря!Каковы некоторые примеры, в которых используются деревья выражений?
ответ
Или это полезно только в качестве транспортного механизма для кода?
Полезно как механизм выполнения для кода. Используя interpreter pattern, деревья выражений могут быть непосредственно интерпретированы. Это полезно, потому что это очень легко и быстро реализовать. Такие интерпретаторы являются повсеместными и используются даже в случаях, которые, по-видимому, не «интерпретируют» что-либо, например. для печати вложенных структур.
Некоторые модульные тестовые фальшивые рамки используют деревья выражений, чтобы настроить строго типизированные ожидания/проверки. Т.е.:
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
Деревья выражений полезны, когда вам нужно получить доступ к функциональной логике, чтобы каким-либо образом изменить или повторно применить ее.
Linq к SQL является хорошим примером:
//a linq to sql statement
var recs (
from rec in LinqDataContext.Table
where rec.IntField > 5
select rec);
Если у нас не было деревьев выражений это заявление будет иметь, чтобы вернуть все записи, а затем применить C#, где логика каждого.
С деревьев выражений, которые where rec.IntField > 5
могут быть разобраны в SQL:
--SQL statment executed
select *
from [table]
where [table].[IntField] > 5