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. UVa Online Judge 工具網站

    UVa Online Judge 工具網站   UVa中译题uHuntAlgorithmist Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 Mirror UVa Online Judg ...

  2. synthesize(合成) keyword in IOS

    synthesize creates setter and getter (从Objective-C 2.0开始,合成可自动生成存取方法) the setter is used by IOS to s ...

  3. 【Objective-C】04-第一个OC程序解析

    说明:这个Objective-C专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序猿,可以高速上手Objective-C.假设你还没有编程经验,或者对Objective-C.iOS开发 ...

  4. velocity模板技术生成word文档

    本文介绍採用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容例如以下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项 ...

  5. delphi 去掉TreeView水平滚动条

        使用API函数:声明 FUNCTION ulong ShowScrollBar(ulong hwnd,ulong wBar,ulong bShow) LIBRARY "user32. ...

  6. xampp

    Fatal error: Class 'kernel' not found in C:\xampp\htdocs\shopex\install\install.core.php on line 10 ...

  7. perl详解

    http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html

  8. SVN 冲突文件快速解决方法

    精简的美丽...... 现在几乎没有几个写代码的人不用snv来存储代码了吧! 但是,在实际操作中,多人对同一文件读写造成冲突是时有发生的事.这个时候解决的方法就是打开文件找出冲突的地方.如果冲突的部分 ...

  9. CentOS中查看系统资源占用情况的命令

    用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况 ...

  10. php常见问题辨析(二)

    一:unset: 1.如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值,如果您想在函数中 unset() 一个全局变量,可 ...