C# 委托 代理
2016-03-19 23:00
393 查看
C# 委托、代理
举例如下B的show方法绑定到A的show方法,使得A在show时B也show
C#中委托代理用法
定义delegate对象类型,如:
public delegate void myEventHandler(object sender ,EventArgs e);
其中 sender代表触发事件的本身,EventArgs 是事件参数类
定义事件参数类,这个可以做也可以不做,看需求,如果需要传递一些信息,可以扩展EventArgs 类,如
public myEventArgs : EventArgs{/这里可以定义一些需要的变量,和方法/}
在传入时应该会自动上溯造型。(会吗?肯定会啊,我自己试过了)
用event关键字定义事件对象,它同时也是一个delegate对象,在绑定时要对该类的这个对象进行绑定(这个对象是一个event,也是一个delegate,也就是它包含是否绑定了事件)
public event myEventHandler show;
要被绑定的方法,也就是B的show这里的show定义和1中的delegate对象有相同的参数和返回值类型(这里呢如果扩展了EventArgs类,对B中的写法是随意的,反正可以上溯造型,恩,我试过了)如:
public void show(object sender ,EvnetArgs e){/TODO/}
绑定,绑定的方式就是对当前的show对象+=比如:
this.show += new myEventHandler((new B()).show);
这里的问题是在哪绑定,可以在A中绑定,传入B或者像这样新建一个B也可以在B中绑定,在B中传入A或者新建一个A,这里的问题是一定要代码可以走到绑定;
写A 的触发事件show,并在show中调用delegate
public void OnShow(){ if(this.show!=null)//判断是否绑定了方法,如果绑定了那就执行呗; this.show(this,new EventArgs()); }
整个过程写完了,现在就是触发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复制过去之后会有行号,卧槽 血崩;
相关文章推荐
- Python动态类型的学习---引用的理解
- c#调用COM组件
- 土人系列AS入门教程 -- 对象篇
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- jQuery中的常用事件总结
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- python面向对象之类成员