首页 > 学院 > 开发设计 > 正文

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

2019-11-17 02:51:10
字体:
来源:转载
供稿:网友

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链。本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理。

□ 调用返回类型为void的委托所形成的委托链方法□ 调用返回类型不是void的委托所形成的委托链方法□ 调用返回类型不是void的泛型委托所形成的委托链方法□ 调用Func<T>泛型委托所形成的委托链方法□ 调用Action<T>泛型委托所形成的委托链方法□ 处理委托链异常

调用返回类型为void的委托所形成的委托链方法

来看下面的例子:

namespace Consoleapplication3
{
    internal delegate void MySayDel(string msg);
    class PRogram
    {
        static void Main(string[] args)
        {
            MySayDel del = SayHello;
            del = (MySayDel)Delegate.Combine(del, new MySayDel(SayNice)); //等同于:del += SayNice;           
            del += SayOk;
            del("darren");
        }
        static void SayHello(string msg)
        {
            Console.WriteLine("hello " + msg);
        }
        static void SayNice(string msg)
        {
            Console.WriteLine("nice " + msg);
        }
        static void SayOk(string msg)
        {
            Console.WriteLine("ok " + msg);
        }
    }
}

3

最后,调用委托执行方法,最先注册的方法最先执行。"+="是一种"语法糖",内部其实调用了Delegate的静态方法Combine,形成委托链,再把委托链赋给委托变量。大致如下:

→当执行MySayDel del = SayHello;4→当执行del = (MySayDel)Delegate.Combine(del, new MySayDel(SayNice)),在托管堆上又创建MySayDel委托实例指向SayNice方法,接着复制原先的、指向SayHello方法的委托实例,2个委托实例形成委托链,即蓝色区域部分,栈上的委托变量del指向委托链。5

调用返回类型不是void的委托所形成的委托链方法

以上,委托的返回类型是void,当调用委托的时候,依次执行委托链的方法。可是,如果委托的返回类型不是void,会不会依次执行委托链的方法呢?

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表