学习了匿名委托Func<T,TResult>后,对委托的了解更深入了点。
如果对委托不了解,我们先看委托的概念和定义:
Func<T, TResult> 委托
.NET Framework (current version)
封装一个方法,该方法具有一个参数,且返回由 TResult 参数指定的类型的值。
如需仔细了解请看官方文档:https://msdn.microsoft.com/zh-cn/library/bb549151(v=vs.110).aspx
我创建了个控制台demo,用于理解委托的使用
/// <summary>
/// 委托的使用方法
/// </summary>
class Delegate
{
delegate void TestDelegate(string s);
public void Test()
{
//带有输出的隐式委托
Func<string, string> func = s => s.ToUpper();
string name = "Dakao";
string name2 = "Dao";
Console.WriteLine(func(name));
//自定义委托返回方法
Func<string, string> func2 = n =>
{
return $"{n}Wold".ToUpper();
};
Console.WriteLine(func2(name));
Func<string, string, string> func3 = (x, s) => s.ToUpper();
Console.WriteLine(func3(name, name2));
//显式委托+lambda方法体
TestDelegate del = n => {
string s = n + " World2";
Console.WriteLine(s);
};
del(name);
//Console.WriteLine("Hello World!");
Console.ReadLine();
}
}
有了上面的例子可以很好区分委托了,但是我在一个项目底层看到底层里面可以把委托作为表达式树的类型,然后用于表达SQL的where条件,我就有点纳闷了,下面再解释下表达式树Expression。
表达式树在微软官方文档有仔细介绍:注意只能从lambdas生成
这意味着表达式树的概念,理解了这点我们就可以用一个demo理解使用关系了和区分了。
/// <summary>
///表达式树
/// 表达式树是把Lambda表达式存起来。在一些底层里面可以作为SQL的where条件使用。
/// </summary>
public class Expression
{
//基础委托
Func<int, bool> func = num => num>5;
//表达式树
Expression<Func<int, bool>> lambda = num => num < 5;
//定义表达式树list
List<Expression<Func<int, bool>>> expressions = new List<Expression<Func<int, bool>>>();
void Test()
{
//假设这里是拼接where条件的地方
expressions.Add(lambda);
}
}
总结:表达式树并不是直接把委托作为类型,它仅仅是把lambda表达式记录下来,类似一个变量接收了值。
Expression<Func<int, bool>> lambda = num => num < 5;
个人观点,高手请指点。