C# 使用表达式的实际含义<;T>;在与代表的方法中

C# 使用表达式的实际含义<;T>;在与代表的方法中,c#,delegates,implementation,C#,Delegates,Implementation,使用Linq.Expression类型,我们可以通过编程方式定义AST,以便以后进行计算和/或执行 但实际上,以这种方式定义方法签名的含义是什么: public void SomeMethod1(Func<bool> func) { ... } // 1. 到 在原始实践层面,调用也类似: SomeMethod1(() => true); // A. SomeMethod1(() => AMethodReturnsABool()); // B. SomeMethod1(

使用
Linq.Expression
类型,我们可以通过编程方式定义AST,以便以后进行计算和/或执行

但实际上,以这种方式定义方法签名的含义是什么:

public void SomeMethod1(Func<bool> func) { ... } // 1.

在原始实践层面,调用也类似:

SomeMethod1(() => true); // A.
SomeMethod1(() => AMethodReturnsABool()); // B.
SomeMethod1(AMethodReturnsABool); // C.
不同之处在于编译级别的
SomeMethod2
不接受方法组语法:


当我需要用标准委托定义签名时
Action
Func
当我应该在
表达式中定义它们时

简单。如果不需要访问LINQ表达式的AST,请使用编译(匿名委托)版本

我认为您可能需要访问AST的情况:

  • 将AST转换为其他内容,如SQLWHERE子句
  • 分析编写的代码的一些属性
  • 以编程方式构建一个委托。例如,从一些用户输入构建表达式对象。这可以省去使用其IL转换器编写自己的AST的麻烦
  • 引导数据访问层能够使用LinqToSQL或具有相同LINQ查询规范的简单内存中列表

简而言之,如果您不需要表达式,就不要使用表达式。

IMHO,除非您不编写通过拖放生成代码的软件。在大多数实际情况下,你不需要它。请看这个问题@Fendy+1,谢谢你的链接。我试着搜索,但我错过了这个问题。
var result = func(); // 1.
var func = expr.Compile() // 2.
var result = func();
SomeMethod1(() => true); // A.
SomeMethod1(() => AMethodReturnsABool()); // B.
SomeMethod1(AMethodReturnsABool); // C.
//SomeMethod2(AMethodReturnsABool); // -> don't compile