В чем именно смысл деревьев выражения?
Ок, я просто не понимаю.
Я прочитал столько, сколько мог по этому вопросу, не зная, о чем это все:
- зачем использовать деревья выражений?
- Что такое реальный пример того, когда и как я буду их использовать?
- какое общее преимущество(ы) есть в их использовании?
6 ответов
Expression trees API изначально был написан для создания пользовательских поставщиков LINQ. В принципе, если вы используете LINQ для объектов, вы не имеете дело с деревьями выражений. Но если вы работаете с LINQ to SQL, поставщик LINQ работает с деревьями выражений.
в .Net 4.0 Expression Trees API был расширен и активно используется DLR. Итак, если вы собираетесь, скажем, добавить новый динамический langauge в .NET, вам это понадобится.
Как это часто бывает, люди нашли более способы использования деревьев выражений. Иногда вы можете использовать ET для получения дополнительной информации об объектах вместо отражения. В .NET 4 вы также можете использовать их для создания динамических методов. Но помните, что это больше похоже на продвинутые трюки, а не на рекомендуемые сценарии.
вот некоторые ссылки, на которые вы можете взглянуть:
получение информации об объектах, типах и членах с выражением Деревья!--10-->
создание динамических методов с деревьями выражений в Visual Studio 2010
дерево выражений по существу является анализируемым битом кода, обрабатываемым вами как данные. Затем ваша программа может интерпретировать эти данные так, как вам нравится во время выполнения. Это позволяет интерпретировать код в свете вашей бизнес-логики.
скажем, вам нужно определить бизнес-правила. Вы можете определить синтаксис для них на основе C#, а затем иметь новое правило, написанное непосредственно в исходном коде. Принимая его в свой движок как дерево выражений, утомительная работа синтаксического анализа, проверки синтаксиса и проверка типа уже сделана для вас. Вам просто нужно пробежаться по дереву и применить правило.
Они действительно очень полезны.
каждое лямбда-выражение может стать либо методом, либо деревом выражений.
методы, очевидно, выполняются native в рамках.
деревья выражений можно перевести в другое представление. Например, LINQ for SQL преобразует выражения запросов в синтаксис SQL и выполняет их удаленно на сервере.
когда вы пишете что-то вроде этого:
var q = from d in Data.Table
where d.Name == "SomeName"
select d
преобразовано в дерево выражений. Когда вы используете этот запрос LINQ к SQL против нижележащего технологии LINQ-в-SQL использует это дерево, чтобы сделать высокий performaned SQL-запроса.
таким образом, он используется "за кулисами" в том, что вы делаете LINQ.
вы можете создать свои собственные деревья выражений. Это может быть очень полезно, если вы хотите делать динамические запросы. Это может быть другой вид критериев поиска. Ты мог бы ... даже используйте его, чтобы сделать несколько внутренних соединений с where-clauses и другими классными вещами, даже не зная типов, которые вы используете. Это хоть реквье какое-то размышление делать.
предположим, что вы пишете поставщик запросов для LINQ (например, поставщик SQL Server, который переводит запросы LINQ в SQL) - возможно, вы являетесь поставщиком БД и хотите реализовать поддержку вашего ядра БД. Вы будете использовать деревья выражений для построения sql.
Они очень полезны. Помимо linq to sql они используются для создания строго типизированные HTML-помощники в mvc 2.0 или предоставить средства для использования GPU для математического расчета ie проект Брахма.
в основном деревья выражений дает возможность интерпретировать скомпилированное выражение вместо его выполнения. Таким образом, они являются средствами для создания своего рода DSL в C#.