C# 委托 代理

C# 委托、代理


举例如下
B的show方法绑定到A的show方法,使得A在show时B也show
C#中委托代理用法

  1. 定义delegate对象类型,如:

    public delegate void myEventHandler(object sender ,EventArgs e);
    其中 sender代表触发事件的本身,EventArgs 是事件参数类

  2. 定义事件参数类,这个可以做也可以不做,看需求,如果需要传递一些信息,可以扩展EventArgs 类,如

    public myEventArgs : EventArgs{/这里可以定义一些需要的变量,和方法/}
    在传入时应该会自动上溯造型。(会吗?肯定会啊,我自己试过了)

  3. 用event关键字定义事件对象,它同时也是一个delegate对象,在绑定时要对该类的这个对象进行绑定(这个对象是一个event,也是一个delegate,也就是它包含是否绑定了事件)

    public event myEventHandler show;

  4. 要被绑定的方法,也就是B的show这里的show定义和1中的delegate对象有相同的参数和返回值类型(这里呢如果扩展了EventArgs类,对B中的写法是随意的,反正可以上溯造型,恩,我试过了)如:

    public void show(object sender ,EvnetArgs e){/TODO/}

  5. 绑定,绑定的方式就是对当前的show对象+=比如:

    this.show += new myEventHandler((new B()).show);
    这里的问题是在哪绑定,可以在A中绑定,传入B或者像这样新建一个B也可以在B中绑定,在B中传入A或者新建一个A,这里的问题是一定要代码可以走到绑定;

  6. 写A 的触发事件show,并在show中调用delegate

    public void OnShow(){
    if(this.show!=null)//判断是否绑定了方法,如果绑定了那就执行呗;
    this.show(this,new EventArgs());                  
    }
  7. 整个过程写完了,现在就是触发A的OnShow就可以了


参考了寒飞雨的博文

同时附上一片比较好懂的代码修改自上述作者

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate {
    // 扩展EventArgs  如果不需要可以不用
    public class myEventArgs:EventArgs{
        public int k= 10;
      }
    class Dog {
      public Dog(){
        Host host = new Host();
        this.Alarm += new AlarmEventHandler(host.hostEventHandler);
      }
      //delegate
      public delegate void AlarmEventHandler(object sender , myEventArgs e);
      //event
      public event AlarmEventHandler Alarm;
      // yinfa shijian de hanshu
      public void OnAlarm(){
        Console.WriteLine("dog Aalrt");
        if(this.Alarm!=null){
          this.Alarm(this,new myEventArgs());
        }
      }
    }
    class Host{
      public void  hostEventHandler(object sender,EventArgs e){
        Console.WriteLine("Host konwn");
//        Console.WriteLine(((myEventArgs)e).k);//扩展EventArgs后
      /*DOTO*/
      }
    }

    class Delegate{
      public static void Main(String []args){
        Dog dog = new Dog();
        dog.OnAlarm();
        Console.ReadKey();
      }
    }
}

markdown复制过去之后会有行号,卧槽 血崩;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值