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