细讲委托和创建匿函数和使用Lambda表达示,运用泛型委托,表达式树 返回
什么是委托?
委托可以理解为是函数的一个指针,要使用委托我们需要来声名一个委托
private delegate string GetString(string name);
GetString就可以理解为一个具有(string name)参数的方法类型,所以GetString gs可以等于具有相同参数和相同返回值的任何函数。
private delegate string GetString(string name);
private static string GetHello(string name)
{
return "hello: " + name;
}
private static string GetAsk(string name)
{
return name + "大神,帮帮我。";
}
static void Main(string[] args)
{
GetString getHelloName = GetHello;
Console.WriteLine(getHelloName("小杰"));//然后getHelloName这个变量变能当GetHello一样使用。
GetString getAsk = GetAsk
Console.WriteLine(getAsk("小杰"));
}输出

什么是匿名委托
如果每次写一个委托还需要,在额外写一个函数,这样也就失去了使用的价值,GetString本身就是函数类型 所以我们可以用delegate创建一个没有名字的函数,我们称之为匿名函数,下面的代码实现了和上面的代码一样的功能。
GetString getHelloName = delegate (string name) { return "hello: " + name; };
Console.WriteLine(getHelloName("小杰"));
GetString getAsk = delegate (string name) { return name + "大神,帮帮我。"; };
Console.WriteLine(getAsk("小杰"));用拉姆达简化Deletegate
我们可以使用拉姆达来创建匿名函数
GetString getHelloName = (string name) => { return name + "大神,帮帮我。"; }; ;
Console.WriteLine(getHelloName("小杰"));
GetString getAsk = (string name) => { return name + "大神,帮帮我。"; };
Console.WriteLine(getAsk("小杰"));在简化
GetString getHelloName = name => { return name + "大神,帮帮我。"; }; ;
Console.WriteLine(getHelloName("小杰"));
GetString getAsk = name => { return name + "大神,帮帮我。"; };
Console.WriteLine(getAsk("小杰"));在简化
GetString getHelloName = name => name + "大神,帮帮我。";
Console.WriteLine(getHelloName("小杰"));
GetString getAsk = name => name + "大神,帮帮我。";
Console.WriteLine(getAsk("小杰"));到这里已经是我们最熟悉的写法了,就不多介绍了。
使用泛型委托简化代码
上面的代码右边已经没办法在简化了,所以我们把左边在优化一下。
private delegate string GetString(string name); GetString getHelloName = name => name + "大神,帮帮我。";
可以优化成下面的方法,其中Func第一个string是函数的参数,第二个string就是相当于函数的返回值
Func<string,string> getHelloName = name => name + "大神,帮帮我。";
例如Func<string,string,int>对应的匿名函数就可以是 (string 参数1,string参数2)=>{ return 1;}//2两个string参数返回的int
最终版
Func<string,string> getHelloName = name => name + "大神,帮帮我。";
Console.WriteLine(getHelloName("小杰"));
Func<string, string> getAsk = name => name + "大神,帮帮我。";
Console.WriteLine(getAsk("小杰"));Func有返回值的泛型委托Action对应没有返回值的委托
例如Action<string,string>对应的匿名函数就可以是 (string 参数1,string参数2)=>{ 处理逻辑无返回值 }//2两个string参数
拉姆达表达式和表达式树
拉姆达表达式和拉姆达树这两个概念是不一样的
拉姆达表达式:我们可以理解为C#的一种语法糖,用来快速创建匿名函数。
拉姆达树:是用来存储拉姆达表达式的对象,装进一个容器,然后可以通过反射等方式来执行存储后的对象。EF和SqlSugar等ORM都是使用的该原理来对拉姆达进行解析。
Expression<Func<bool,T> exp = t=>t.id>0;
前半部分是ORM Where函数的参数类型,后半部分可以理解为ORM参数的值 ,我们用法是这样子的 .Where(it=>it.id>0) 那么就是这么一个函数
IQueryable Where(Expression<Fun<bool,T>> exp){ ... }
热忱回答(2)
-
Everlasting VIP0
2016/12/19Expression<Func<bool,T> exp = t=>t.id>0;参数类型写反了吧?
0 回复 -
fate stay night VIP0
2016/12/19@Everlasting:是的这个写反了
0 回复