博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#委托与事件
阅读量:4973 次
发布时间:2019-06-12

本文共 3188 字,大约阅读时间需要 10 分钟。

  写在前面:新手学车,误撞轻拍!

一.关于委托,在刚开始看的时候心中一直有着这样几个疑问:

  1.什么是委托?

  2.委托有存在的必要吗?

  3委托的作用和特点究竟在哪里?

  看了很多讲解,翻了很多书,整理出如下实例

 

二.什么是委托?

  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是委托。

  而在C#中同样是这样的道理。只是整个动作中有两个对象,施加委托者和委托承担者是两个对象而不是人而已。

  委托的代码写法:

public delegate void MessageManager();

  和方法的写法差不多,只是内部没有实际处理代码。

  delegate是委托的关键词,这个就是介于施加委托者和委托承担者的委托关系处理关键。

 

三.举例说话

  举个例子,某公司领导Manager有件关于代码处理的工作(Coding)需要委托个下属小张(MrZhang)去做。

  a.下面看领导(Manager)和小张(MrZhang)的内部动作代码,下面是

        public delegate void MessageManager();

  上面是施加委托者的方法代码。

  b.下面看小张(MrZhang)的内部代码:

public class MrZhang    {       public static void Coding()        {            MessageBox.Show("小张Coding已完成");        }}

  小张本身含有能完成Coding工作的能力。

  c.下面看委托部分了,领导如何委托给小张。

MessageManager Manager = new MessageManager(MrZhang.Coding);          Manager();

  MessageManager Manager = new MessageManager(MrZhang.Coding);

  这是委托的具体动作,要做的动作是Coding,而这件事儿委托给MrZhang来做了。

  1.委托的方法必须要加上,因为委托的构造函数是不为空的。

  2.委托的参数和返回类型,都要和你要具体委托的方法要一致

  然后开始执行Manager();

  d.整体代码如下,读者可以复制到工程尝试下:

 

public class MainWindow{ delegate void MessageManager();        public MainWindow()        {            InitializeComponent();            MessageManager Manager = new MessageManager(MrZhang.Coding);            Manager();        }} public class MrZhang    {       public static void Coding()        {            MessageBox.Show("小张Coding已完成");        }     }

  e.委托事件可以同时委托给多个对象,如下:

public MainWindow()        {            InitializeComponent();            MessageManager Manager = new MessageManager(MrZhang.Coding);            //通过+=绑定委托            Manager += new MessageManager(MrLiu.Coding);            Manager();            //通过-=解绑        Manager -= new MessageManager(MrLiu.Coding);         }

  可以通过+=同时将委托给多个对象,也可以通过-=将已委托给对象的事件解绑。

 

 四.传参委托

   注意:这个是我自己理解出来之后为了简单易懂命名的,重在讨论和明白,看着觉得误导的就忽略这个词吧。

  在写代码的时候经常看到(sender,e)这两个参数

private void Button_Click_1(object sender, RoutedEventArgs e)        {            Manager.BuyerManager += new Manager.MessageManager(MrZhang.Buyer);                  }

 

  那么这两个参数究竟有什么含义呢,sender代表的是发送者自己,e包含其内部参数。

  a.而笔者传参的参数就是放在e里面,只是自定义了参数类,继承自EventArgs。

public class EventCollection : EventArgs    {        public readonly string work;        public EventCollection() { }        public EventCollection(string data)        {            this.work = data;        }    }

   b.继续刚刚的例子,在委托承担者小张的类里添加含参数工作:

public static void Work(object sender, EventCollection e)        {            MessageBox.Show("小刘" + e.work + "已完成");        }

  c.在Manager内,添加委托及事件处理细节:

public delegate void MessageManager2(object sender, EventCollection e);        public event MessageManager2 WorkManager;        public void WorkIssue(string work) {            Onwork(new EventCollection(work));        }        //添加保护,只有在委托事件绑定之后才可以实现事件处理。        public void Onwork(EventCollection e) {            if (WorkManager != null) {                WorkManager(this,e);            }        }

  d.绑定委托

Manager Manager = new Manager();  Manager.WorkManager += new Manager.MessageManager2(MrZhang.Work);      Manager.WorkIssue("传递文件");

 

五.

 

六.上述主要用作整理笔记,中间借鉴了很多,附个大神链接http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html

转载于:https://www.cnblogs.com/Khan-Sadas/p/5220789.html

你可能感兴趣的文章
处理器管理与进程调度
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
mysql adddate()函数
查看>>
mysql sin() 函数
查看>>
单片机复位电路
查看>>
php json_decode失败,返回null
查看>>
3-day3-list-truple-map.py
查看>>
Edit控件显示多行文字
查看>>
JS第二周
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
迭代dict的value
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
Py 可能是最全面的 python 字符串拼接总结(带注释版)
查看>>
《Java程序设计实验》 软件工程18-1,3 OO实验2
查看>>
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
OPENSSL使用方法
查看>>