细讲委托和创建匿函数和使用Lambda表达示,运用泛型委托,表达式树 返回

精华
2 2145

什么是委托?

委托可以理解为是函数的一个指针,要使用委托我们需要来声名一个委托

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("小杰"));
}


输出

QQ截图20161217220512.jpg

什么是匿名委托

如果每次写一个委托还需要,在额外写一个函数,这样也就失去了使用的价值,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

版块

学习文档

最新会员

发布达人

回贴达人