Delegate&Event
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的更多相关文章
- C# delegate event func action 匿名方法 lambda表达式
delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...
- [UE4] C++实现Delegate Event实例(例子、example、sample)
转自:http://aigo.iteye.com/blog/2301010 虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子, ...
- [C#] Delegate, Multicase delegate, Event
声明:这篇博客翻译自:https://www.codeproject.com/Articles/1061085/Delegates-Multicast-delegates-and-Events-in- ...
- C# delegate & event
public delegate void MyDelegate(string mydelegate);//声明一个delegate对象 //实现有相同参数和返回值的函数 public v ...
- Delegate & Event
Long time without coding,貌似对programming都失去了曾有的一点点sense了,今日有空再细瞄一下.net的委托和事件. Delegate 首先,委托用于引用一类具有相 ...
- Delegate event 委托事件---两个From窗体使用委托事件
窗体如下: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...
- 委托与事件--delegate&&event
委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...
- delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的
public void TestF() { Test += Fun; } public void Fun(Person p) { } // 如 Person变成 SubPerson,则报错..pub ...
- ue4 delegate event
官网相关 https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Delegates/index.html wi ...
随机推荐
- 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 ...
- 奇妙华为3c手机, 出现安装未成功问题。
1.我会命令adb uninstall 先卸载我们有签名的安装包. 2.用开发模式在手机上执行我们的应用. 3.然后測试就把手机拿走了,就用应用管理器把我们的应用卸载了. 4.继续装我们的开发包,死活 ...
- Fedora 下 安装 chrome
一.下载安装包,安装 1.去google 下载安装包 2.终端下 运行命令: rpm -ivh google-chrome-stable_current_i386.rpm 3. 出现如下 ...
- MapReduce数据连接
对于不同文件里的数据,有时候有相应关系,须要进行连接(join),获得一个新的文件以便进行分析.比方有两个输入文件a.txt,b.txt,当中的数据格式分别例如以下 1 a 2 b 3 c 4 d 1 ...
- MYSQL 备份工具
backup of a database is a very important thing. If no backup, meet the following situation goes craz ...
- centos x86_64--------------------------------系统调用
http://blog.csdn.net/hmsiwtv/article/details/11022241 [root@monitor ~]# cat /usr/include/asm/unistd. ...
- linq小知识总结
1linq的左连接查询 var boundList = from x in text.S_Outbound join y in text.S_Outbound_Per on x.Shipment_ID ...
- 《Java程序员面试宝典》读书笔记1
今天读书发现一个很有趣的问题 请问以下程序会输出什么? public class Test2 { public static void main(String[] arg ...
- Eclipse launch failed.Binary not found解决方案
配置完成后建立工程测试,发现建立Hello World c++ Project类型的项目后可以运行测试,直接建立空项目写个测试类无法运行,提示"launch failed.Binary no ...
- Android(java)学习笔记113:Android编写代码调用Vibrator震动功能(Bug:按下按钮button始终没有震动)
1.之前我编写的代码是如下: package com.himi.vibrate; import android.app.Activity; import android.app.Service; im ...