Delegate

1.基本类:

     public class Student
     {
         public int Id { get; set; }
         public string Name { get; set; }

         public void Study()
         {
             Console.WriteLine("学习.net高级班公开课");
         }

         public void StudyAdvanced(string name)
         {
             Console.WriteLine("学习.net高级班公开课");
         }

         public static void Show()
         {
             Console.WriteLine(");
         }
     }

Student

2. 声明委托

         public delegate void NoReturnNoPara();
         public delegate void NoReturnWithPara(int x, int y);
         public delegate int WithReturnNoPara();
         public delegate string WithReturnWithPara(int x, int y);    

3. =+ 的方法

         private void DoNothing()
         {
             Console.WriteLine("这里是DoNothing");
         }

         private static void DoNothingStatic()
         {
             Console.WriteLine("这里是DoNothing");
         }

         private void ShowPlus(int x, int y)
         {
             Console.WriteLine("ShowPlus x={0} y={1} x+y={2}", x, y, x + y);
         }

         private static void ShowPlusStatic(int x, int y)
         {
             Console.WriteLine("ShowPlusStatic x={0} y={1} x+y={2}", x, y, x + y);
         }    

4.委托三部曲

声明(在上面)+实例化+调用

            {
                 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);//2 委托的实例化
                 method.Invoke();//3 委托调用
                 method();//另一种调用方式
                 //method.BeginInvoke(null, null);//异步调用
                 this.DoNothing();//直接调用对应的方法,效果一样
             }    

5.多播委托

          {
                 NoReturnNoPara method = new NoReturnNoPara(MyDelegate.DoNothingStatic);
                 method += student.Study;
                 method -= student2.Study;
                 method += this.DoNothing;
                 method += student.Study;
                 method += Student.Show;
                 method += () => Console.WriteLine("这里lambda");
                 method.Invoke();
                 //method.BeginInvoke(null,null);//多播委托不能异步
                 method -= MyDelegate.DoNothingStatic;
                 method -= MyDelegate.DoNothingStatic;
                 method -= this.DoNothing;
                 method -= student.Study;
                 method -= Student.Show;
                 method -= () => Console.WriteLine("这里lambda");

                 //委托里面lambda表达式之后加入的方法都无效了?
                 method.Invoke();
             }
             {
                 NoReturnNoPara method = new NoReturnNoPara(student.Study);
                 method.Invoke();
             }
             {
                 NoReturnNoPara method = new NoReturnNoPara(Student.Show);
                 method.Invoke();
             }
             {
                 NoReturnWithPara method = new NoReturnWithPara(ShowPlus);
                 method += ShowPlus;
                 method += ShowPlus;
                 method += ShowPlus;
                 method -= ShowPlus;
                 method -= ShowPlus;
                 method(, );
             }    

Event

    public class Baby
     {
         public void Cry()
         {
             Console.WriteLine("{0} Cry", this.GetType().Name);
         }
     }

Baby

      public class Brother
     {
         public void Turn()
         {
             Console.WriteLine("{0} Turn", this.GetType().Name);
         }
     }

Brother

     public class Dog
     {
         public void Wang()
         {
             Console.WriteLine("{0} Wang", this.GetType().Name);
         }
     }

Dog

     public class Father
     {
         public void Shout()
         {
             Console.WriteLine("{0} Shout", this.GetType().Name);
         }
     }

Father

     public class Mother
     {
         public void Wispher()
         {
             Console.WriteLine("{0} Wispher", this.GetType().Name);
         }
     }

Mother

     public class Mouse
     {
         public void Run()
         {
             Console.WriteLine("{0} Run", this.GetType().Name);
         }
     }

Mouse

     public class Neighbor
     {
         public void Awake()
         {
             Console.WriteLine("{0} Awake", this.GetType().Name);
         }
     }

Neighbor

     public class Stealer
     {
         public void Hide()
         {
             Console.WriteLine("{0} Hide", this.GetType().Name);
         }
     }

Stealer

                              发布
     /// <summary>
     /// 发布者
     /// 一只猫,miao一声
     /// 导致一系列的触发动作
     /// </summary>
     public class Cat
     {
         public void Miao()
         {
             Console.WriteLine("{0} Miao", this.GetType().Name);
             new Neighbor().Awake();
             new Mouse().Run();
             new Dog().Wang();
             new Baby().Cry();
             new Mother().Wispher();
             new Brother().Turn();
             new Father().Shout();
         }

         public Action MiaoAction;//委托的实例
         public event Action MiaoActionEvent;//事件是 委托的实例,加了event关键字-----发布者
         //event做了权限控制,保证外部不能赋值和调用
         public void MiaoDelegate()
         {
             Console.WriteLine("{0} MiaoDelegate", this.GetType().Name);

             MiaoAction.Invoke();
         }

         public void MiaoEvent()
         {
             Console.WriteLine("{0} MiaoEvent", this.GetType().Name);
             if (MiaoActionEvent != null)
             {
                 //MiaoActionEvent.Invoke();
                 //MiaoActionEvent();
                 foreach (Action item in MiaoActionEvent.GetInvocationList())//触发
                 {
                     Console.WriteLine("*********");
                     item.Invoke();
                     //item.BeginInvoke(null,null);
                 }
             }
         }
     }

订阅:

           {
                     Console.WriteLine("*******Miao******");
                     Cat cat = new Cat();
                     cat.Miao();

                     Console.WriteLine("*******MiaoDelegate******");
                     //cat.MiaoAction += new Neighbor().Awake;

                     cat.MiaoAction += new Mouse().Run;
                     cat.MiaoAction -= new Mouse().Run;
                     cat.MiaoAction += new Baby().Cry;
                     cat.MiaoAction += new Mother().Wispher;

                     cat.MiaoAction.Invoke();
                     cat.MiaoAction = null;

                     cat.MiaoAction += new Brother().Turn;
                     cat.MiaoAction += new Father().Shout;
                     cat.MiaoAction += new Dog().Wang;

                     cat.MiaoDelegate();

                     Console.WriteLine("*******MiaoEvent******");
                     cat.MiaoActionEvent += new Neighbor().Awake;
                     cat.MiaoActionEvent += new Mouse().Run;
                     cat.MiaoActionEvent += new Baby().Cry;

                     //cat.MiaoActionEvent.Invoke();
                     //cat.MiaoActionEvent = null;

                     cat.MiaoActionEvent += new Mother().Wispher;
                     cat.MiaoActionEvent += new Brother().Turn;
                     cat.MiaoActionEvent += new Father().Shout;
                     cat.MiaoActionEvent += new Dog().Wang;
                     cat.MiaoEvent();
                 }

Delegate&Event的更多相关文章

  1. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

  2. [UE4] C++实现Delegate Event实例(例子、example、sample)

    转自:http://aigo.iteye.com/blog/2301010 虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子, ...

  3. [C#] Delegate, Multicase delegate, Event

    声明:这篇博客翻译自:https://www.codeproject.com/Articles/1061085/Delegates-Multicast-delegates-and-Events-in- ...

  4. C# delegate & event

    public delegate void MyDelegate(string mydelegate);//声明一个delegate对象 //实现有相同参数和返回值的函数        public v ...

  5. Delegate & Event

    Long time without coding,貌似对programming都失去了曾有的一点点sense了,今日有空再细瞄一下.net的委托和事件. Delegate 首先,委托用于引用一类具有相 ...

  6. Delegate event 委托事件---两个From窗体使用委托事件

    窗体如下:   public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...

  7. 委托与事件--delegate&&event

    委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...

  8. delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的

    public void TestF() { Test += Fun; } public void Fun(Person p) { }  // 如 Person变成 SubPerson,则报错..pub ...

  9. ue4 delegate event

    官网相关 https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Delegates/index.html wi ...

随机推荐

  1. Codeforces Round #280 (Div. 2) E. Vanya and Field 数学

    E. Vanya and Field Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/492/pr ...

  2. 奇妙华为3c手机, 出现安装未成功问题。

    1.我会命令adb uninstall 先卸载我们有签名的安装包. 2.用开发模式在手机上执行我们的应用. 3.然后測试就把手机拿走了,就用应用管理器把我们的应用卸载了. 4.继续装我们的开发包,死活 ...

  3. Fedora 下 安装 chrome

    一.下载安装包,安装 1.去google 下载安装包 2.终端下    运行命令:    rpm -ivh google-chrome-stable_current_i386.rpm 3.  出现如下 ...

  4. MapReduce数据连接

    对于不同文件里的数据,有时候有相应关系,须要进行连接(join),获得一个新的文件以便进行分析.比方有两个输入文件a.txt,b.txt,当中的数据格式分别例如以下 1 a 2 b 3 c 4 d 1 ...

  5. MYSQL 备份工具

    backup of a database is a very important thing. If no backup, meet the following situation goes craz ...

  6. centos x86_64--------------------------------系统调用

    http://blog.csdn.net/hmsiwtv/article/details/11022241 [root@monitor ~]# cat /usr/include/asm/unistd. ...

  7. linq小知识总结

    1linq的左连接查询 var boundList = from x in text.S_Outbound join y in text.S_Outbound_Per on x.Shipment_ID ...

  8. 《Java程序员面试宝典》读书笔记1

    今天读书发现一个很有趣的问题 请问以下程序会输出什么? public   class   Test2   {  public   static   void   main(String[]   arg ...

  9. Eclipse launch failed.Binary not found解决方案

    配置完成后建立工程测试,发现建立Hello World c++ Project类型的项目后可以运行测试,直接建立空项目写个测试类无法运行,提示"launch failed.Binary no ...

  10. Android(java)学习笔记113:Android编写代码调用Vibrator震动功能(Bug:按下按钮button始终没有震动)

    1.之前我编写的代码是如下: package com.himi.vibrate; import android.app.Activity; import android.app.Service; im ...