В каких случаях полезны деревья выражений?

StackOverflow https://stackoverflow.com/questions/27726

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top