Я полностью понимаю понятие деревьев выражений, но мне нелегко пытаться найти ситуации, в которых они полезны. Существует ли определенный экземпляр, в котором могут быть применены деревья выражений? Или действительно ли это только полезно как транспортный механизм для кода? Я чувствую, что пропускаю что-то здесь.Спасибо!
Или действительно ли это только полезно как транспортный механизм для кода?
Это полезно как механизм выполнения для кода. Используя шаблон интерпретатора, могут непосредственно быть интерпретированы деревья выражений. Это полезно, потому что это очень легко и быстро для реализации. Такие интерпретаторы повсеместны и используются даже в случаях, которые, кажется, ничего не “интерпретируют”, например, для печати вложенных структур.
Некоторые платформы насмешки модульного теста используют деревья выражений для установки ожиданий/проверок со строгим контролем типов. Т.е.:
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