委托(2)

匿名委托

当方法需要委托类型参数时,我们就传递类型与之对应的方法A过去,如果方法A在项目中仅使用了一次,那为了传参单独建一个方法就有点浪费了,这时我们可以使用匿名方法。

//DelegateHelper.cs文件代码
public delegate string SayHiEventHandler(string name);
public class DelegateHelper
{
    public void SayHi(string name,SayHiEventHandler sayHi)
    {
        sayHi(name);
    }

    public string SayHiByEnglish(string name)
    {
        Console.WriteLine("Hello:" + name);
        return "success";
    }

    public string SayHiByChinese(string name)
    {
        Console.WriteLine("你好:" + name);
        return "成功";
    }
}
//Program.cs文件代码
class Program
{
    static void Main(string[] args)
    {
        //传递已有方法
        new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese);
        new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish);
        //传递匿名方法
        new DelegateHelper().SayHi("蝈蝈", delegate(string name) { 
            Console.WriteLine("匿名方法,name=" + name); return "匿名方法"; 
        });
        Console.ReadKey();
    }
}

运行结果如下:
这里写图片描述

Lambda表达式来源

匿名方法进一步简化就可以得到Lambda表达式,下面演示简化过程:

static void Main(string[] args)
{
    //匿名方法
    new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler(delegate(string name) { Console.WriteLine(name); return name + "aaa"; }));
    //去掉delegate,增加=>
    new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((string name) => { Console.WriteLine(name); return name + "aaa"; }));
    //去掉参数类型
    new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((name) => { Console.WriteLine(name); return name + "aaa"; }));
    //简化委托,去掉new SayHiEventHandler()
    new DelegateHelper().SayHi("蝈蝈", (name) => { Console.WriteLine(name); return name + "aaa"; });
    //仅当参数只有一个时,可以省略参数的()
    new DelegateHelper().SayHi("蝈蝈", name => { Console.WriteLine(name); return name + "aaa"; });
    //仅当委托的方法体只有一句话且没有返回值时可以省略方法体的{}
    //这就是我们常见的Lambda表达式
    new DelegateHelper().GoodMorning("蝈蝈", name => Console.WriteLine(name + "aaa"));
    //当委托的方法体有返回值时不能省略方法体的{}
    new DelegateHelper().SayHi("蝈蝈", name => { return name + "aaa"; });
}

Action<>与Func<>

上面说到如果方法只用一次那可以用匿名方法来代替,如果委托只用一次的话也可以被代替,没参数、没返回值的委托用Action代替,有参数没返回值的委托用Action<>代替,有返回值的委托用Func<>代替。
Program.cs文件代码:

class Program
{
    static void Main(string[] args)
    {
        //有返回值
        new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese);
        new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish);
        new DelegateHelper().SayHi("蝈蝈", delegate(string name) { 
            Console.WriteLine("匿名方法,name=" + name); return "匿名方法返回值"; 
        });
        new DelegateHelper().SayHiByFunc("【func】蝈蝈", new DelegateHelper().SayHiByChinese);
        new DelegateHelper().SayHiByFunc("【func】guoguo", new DelegateHelper().SayHiByEnglish);
        new DelegateHelper().SayHiByFunc("【func】蝈蝈", delegate(string name) {
            Console.WriteLine("匿名方法,name=" + name);
            return "匿名方法返回值"; 
        });
        Console.WriteLine("----------------------------");
        //没有返回值
        new DelegateHelper().GoodMorning("蝈蝈", new DelegateHelper().GoodMorningByChinese);
        new DelegateHelper().GoodMorning("guoguo", new DelegateHelper().GoodMorningByEnglish);
        new DelegateHelper().GoodMorning("蝈蝈", delegate(string name)
        {
            Console.WriteLine("匿名方法,name=" + name); 
        });
        new DelegateHelper().GoodMorningByAction("【action】蝈蝈", new DelegateHelper().GoodMorningByChinese);
        new DelegateHelper().GoodMorningByAction("【action】guoguo", new DelegateHelper().GoodMorningByEnglish);
        new DelegateHelper().GoodMorningByAction("【action】蝈蝈", delegate(string name)
        {
            Console.WriteLine("匿名方法,name=" + name);
        });

        Console.ReadKey();
    }
}

DelegateHelper.cs文件代码:

public delegate string SayHiEventHandler(string name);
public delegate void GoodMorningEventHandler(string name);
public class DelegateHelper
{
    public void SayHi(string name,SayHiEventHandler sayHi)
    {
        sayHi(name);
    }
    //Func<string,string> func表示包含一个string参数、返回值为string类型的委托
    //Func<>最后一个参数表示返回值类型,其他参数均为方法所需参数
    //Func<string> func表示无参数、返回值为string类型的委托
    public void SayHiByFunc(string name, Func<string, string> func)
    {
        func(name);
    }

    public void GoodMorning(string name, GoodMorningEventHandler morning)
    {
        morning(name);
    }
    //Action<string> action表示包含一个string参数、无返回值的委托,
    //Action action表示无参数、无返回值的委托
    public void GoodMorningByAction(string name, Action<string> action)
    {
        action(name);
    }

    public string SayHiByEnglish(string name)
    {
        Console.WriteLine("Hello:" + name);
        return "success";
    }

    public string SayHiByChinese(string name)
    {
        Console.WriteLine("你好:" + name);
        return "成功";
    }

    public void GoodMorningByEnglish(string name)
    {
        Console.WriteLine("吃了吗:" + name);
    }

    public void GoodMorningByChinese(string name)
    {
        Console.WriteLine("Good Weather:" + name);
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值