【编程思想】C# delegate 委托的本质:方法对象的应用

一、前言

    翻回之前写的博客,前期写的结构确实差很多,

    这次细看了《委托那些事(一)、(二)》,忍不住重新写一下,之前把简单的事情复杂化了。

    为什么现在思维不一样了,有一点我认为是见识的计算机语言多了,会比较语法:为什么它要这么设计。

 

二、委托的本质

    首先有一点,万物皆对象,方法也是对象

    C# 方法的类型是: Func(执行有返回参数)或者 Action(执行无返回)。

 

  委托(delegate)

      就是语法,包装这么一个事情:

      当需要实现执行对象A的a方法时,就触发执行方法b、c、d..,并且方法b、c、d..可以按需定义。

      注:delegate关键词的用法,见链接

      这个关键词存在就是增加语法复杂度,C#语法糖升级,可以使用类型Func或Action,这比delegate更清爽。

 

  事件(event)

        方法b、c、d..的容器,可以往里放方法对象,也可以拿出来。

 

  订阅(event += 方法)

      往方法容器(event)里面放入方法对象,这个动作叫做订阅。event 类型支持 += 方法 的用法。

 

  退订/取消订阅(event -= 方法)

      往方法容器(event)里面移出方法对象,这个动作是取消订阅,也即退订。event 类型支持 -= 方法 的用法。

 

三、示例代码

public delegate void OrderEventHandler(Customer cus, OrderEventArgs e); // 后缀EventHandler 是习惯命名

public class OrderEventArgs : EventArgs    // 习惯把xxEventArgs 继承于C#自带的EventArgs
{
    public string DishName { get; set;} 
    public string Size { get; set;} 
}

public class Customer
{
    private OrderEventHandler orderEventHandler;
    public event OrderEventHandler Order {             // 容器只接受OrderEventHandler 的方法签名
        add { this.orderEventHandler += value;}         // 和get、set一样的,换了个名字
        remove { this.orderEventHandler -= value;}
    }

    public void ThinkForOrder ()                        // 顾客下单
    {
         if (this.orderEventHandler != null ) // 容器里面存在方法时,就不为空
         {  
               // invoke(xxA, xxB) 即执行容器内的所有方法,xxA、xxB类型由OrderEventHandler 指定
               this.orderEventHandler.Invoke(this, new orderEventArgs{ 。。});
         }
    }
}

 

遥想起,初学delegate的时候,看代码看得很痛苦,觉得很绕,现在看来……

就这 ?

 

posted @ 2023-01-14 02:09  Carcar019  阅读(47)  评论(0编辑  收藏  举报