В чем разница между выражением и Func? Та же задача может быть достигнута обоими. Так в чем же разница?Разница между выражением и Func
ответ
Expression treesданные представления логики - что означает, что они могут быть проверены во время выполнения такими вещами, как поставщики LINQ. Они могут решить, что означает код, и, возможно, преобразовать его в другую форму, такую как SQL.
Семейство типов Func
, однако, является просто делегатом. Они заканчиваются как нормальные ИЛ, которые могут быть выполнены непосредственно, но не (легко) исследованы. Обратите внимание, что вы можете скомпилировать деревья выражений (ну, Expression<T>
и LambdaExpression
) в делегаты и выполнить их в управляемом коде, если вам нужно.
Вы можете создать деревья выражений вручную, используя фабричные методы в классе Expression, но как правило, вы просто использовать тот факт, что C# можно преобразовать лямбда-выражения в обоих деревьев выражений и обычных делегатов:
Expression<Func<int, int>> square = x => x * x;
Func<int, int> square = x => x * x;
Обратите внимание, что существуют ограничения, по которым лямбда-выражения могут быть преобразованы в деревья выражений. Самое главное, что только лямбды, состоящие из одного выражения (а не тел оператора) может быть превращены:
// Compile-time error
Expression<Func<int, int>> square = x => { return x * x; };
// Works fine
Func<int, int> square = x => { return x * x; };
Выражение может быть создано во время выполнения, функция не (если вы не используете отражение). После того, как вы построите дерево выражений, вы можете скомпилировать его и превратить в указатель функции, который можно вызвать. Func - это указатель на некоторую уже существующую функцию, которая больше не может быть изменена, а Expression представляет код некоторой функции, которая не существует до ее компиляции.
Вы обычно используете выражение, если вы хотите сохранить семантики кода, так что вы можете перевести его. То есть, выражения позволяют обрабатывать код как данные. Если код не нужно рассматривать как данные (т. Е. Вы не планируете его хранить или переводить), то использование Func является подходящим.
Это не правда, что «они делают то же самое». Expression
описывает ваш намерение таким образом, который может быть интерпретирован во время выполнения - это, если хотите, рецепт. Функция - непрозрачный делегат, что не может быть проверен - его можно использовать как черный ящик. По сравнению с рецептом, это какой-то авто-шеф-повар, который не позволяет вам увидеть, что он делает: дайте ему немного хлеба и курица, закройте глаза, и это даст вам сэндвич, но вы никогда не узнаете .
Я обсуждаю это здесь: Explaining Expression, но рецепт является ключевым для LINQ, RPC и т. Д. И, конечно, если у вас есть рецепт, вы можете сделать своего шеф-повара, используя Expression.Compile()
.
- 1. В чем разница между выражением и выражением?
- 2. Разница между выражением лямбда и выражением лямбда
- 3. Разница между выражением «wait» и «@»
- 4. Разница между классом func vs only func
- 5. Разница между func() и (* this) .func() в C++
- 6. В чем разница между setInterval (Func) и setInterval (функция() {FUNC()})
- 7. И разница между FirstOrDefault (func) & Where (func) .FirstOrDefault()?
- 8. В чем разница между «func» и «func()» в TkInter?
- 9. Есть ли разница между element.addEventListener ('load', func) и element.onload = func?
- 10. Разница между func и overrride func в Swift?
- 11. Есть ли разница между & $ func ($ arg) и $ func -> ($ arg)?
- 12. В чем разница между «(типа FUNC())» и «тип FUNC()»
- 13. разница между выражением лямбда и действием
- 14. Разница между выражением MIB и Enterprise MIB
- 15. Разница между выражением и socketio для nodejs
- 16. Разница между простым и сложным выражением - Javascript
- 17. В чем разница между регулярным выражением «\\» и «,»?
- 18. Почему разница между выражением и утверждением
- 19. Разница между ng-моделью и угловым выражением - {{}}
- 20. В чем разница между регулярным выражением [- +]? и (- | +)?
- 21. В чем разница между выражением и выражением в Java?
- 22. В чем разница между выражением и выражением в JS?
- 23. Различия между (func() {}()); vs (func() {})();
- 24. В чем разница между объектом() FUNC и object.func в быстрой
- 25. Разница между два выражением в Java
- 26. Разные между getters и func getSomething()?
- 27. C#: неявное преобразование между «лямбда-выражением» и «лямбда-выражением»?
- 28. В чем разница между def func (var) и def func = (var)?
- 29. Разница между func (int & x) и func (int & x) в C++
- 30. Есть ли разница между (ptr + i) -> Func() и & ptr [i] .Func()