zoukankan      html  css  js  c++  java
  • C#委托与事件

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

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

      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

  • 相关阅读:
    Windows Phone开发(21):做一个简单的绘图板 转:http://blog.csdn.net/tcjiaan/article/details/7392179
    Windows Phone开发(18):变形金刚第九季——变换 转:http://blog.csdn.net/tcjiaan/article/details/7385056
    Windows Phone开发(24):启动器与选择器之发送短信 转:http://blog.csdn.net/tcjiaan/article/details/7404643
    Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260
    POJ 2484 A Funny Game
    CodeForces 835E The penguin's game
    【SDOI 2015】序列统计
    Cutting Game
    HDU 1525 Euclid's Game
    Fibonacci Nim 斐波那契博弈
  • 原文地址:https://www.cnblogs.com/Khan-Sadas/p/5220789.html
Copyright © 2011-2022 走看看