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