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 ...
随机推荐
- PROCESS_YIELD()宏使用及过程分析<contiki学习笔记之八>
好吧,昨晚上研究了switch()的底层实现原理--发现它并不是一般C语言教科书上那样所言,当然,这对于本身就非常熟悉汇编的同学来说,是小菜一碟.世界上,很多事情是巧合与必然的结合体,没有无缘无故的爱 ...
- C语言signal处理的小例子
[pgsql@localhost tst]$ cat sig01.c #include <stdio.h> #include <signal.h> static void tr ...
- jQuery提交Json数据到Webservice,并接收返回的Json数据
jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...
- 【转】单例模式(python/c++)
1. 什么是单例模式(Singleton pattern)? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易 ...
- cocos2dx 3.0 触摸机制
在cocos2dx 3.0版本号中,废弃了以往2.x版本号的写法,我们先来看一下Layer.h中的一段代码 /* Callback function should not be deprecated, ...
- [OSG]如何用Shader得到物体的世界坐标
来自:http://www.cnblogs.com/hesicong/archive/2008/05/27/1208312.html 最近群里面有个朋友问我关于如何得到OpenGL世界坐标的问题,当时 ...
- 详解Android Handler的使用-别说你不懂handler
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
- C语言--enum,typedef enum 枚举类型详解
原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...
- Codeblocks支持C++11
Setting->Compiler 直接在“Have g++ follow the C++11 ISO C++ language standard [-std=c++11]” 选项上打勾 保存就 ...
- Android进阶笔记07:Android之MVC 理解
1. 为什么需要MVC ? 软件中最核心的,最基本的东西是什么? 答:是的,是数据.我们写的所有代码,都是围绕数据的. 围绕着数据的产生.修改等变化,出现了业务逻辑. 围绕着数 ...