C#委托与代理

转载 2016年05月30日 16:36:30

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院


                       C#委托与代理


使用delegate的好处
规则由publisher制定,统一,适合打框架,有类似c++头文件的好处。  而传统程序规则为 subscriber制定,分散。
如果是个人开发,publisher是逻辑主类,subscriber是处理具体功能得类
如果是团队开发,publisher是主程,subscriber是 各个程序
如果是跨公司开发,publisher是SDK,subscriber是 使用SDK的程序

首先介绍函数签名这个概念。
函数签名:参数和返回值 的格式 组成函数签名
void AAA(string a)
void BBB(string name)
我们说AAA和BBB具有相同的函数签名。

Delegate 
Delegate实际就是对 相同函数签名 的函数的使用。相当于c++里的函数指针。
使用方法
第一步:定义 Delegate,也就是签名格式。
第二步:创建Delegate的对象,并添加符合签名的具体函数。
第三步:使用Delegate对象

如果delegate对象 和 具体函数 在不同类里的话,那么就构成了 sender- reciever 或者说publisher - subscriber模型。

其中delegate和 delegate承载的handler(handler可以是任何相同函数签名的函数,在函数名后在Handler后缀只是为了好区分)。
而参数可以专门封装在一个继承EventArgs的类里,也可以使用Hashtable.


如果delegate对象前面不加event的话。那么该对象实际是一个参数。

而加event的唯一目的是 让该代理既可以加处理函数,又封装在类里。

命名一般是 代表是xxxDelegate  处理函数xxxHandler。

示例

 

  1. //**************************************************************************
  2. //
  3. //Delegate:单独delegate
  4. //
  5. //**************************************************************************
  6. using UnityEngine;
  7. using System.Collections;

  8. public class TestDelegate : MonoBehaviour {
  9. public delegate void PrintGMDelegate(string name);
  10. public void PrintCN(string name)
  11. {
  12. print("譌ゥ荳雁・ス, "+name);
  13. }
  14. public void PrintEN(string name)
  15. {
  16. print("Good morning, "+name);
  17. }
  18. public void PrintDelegate(string name,PrintGMDelegate Make)
  19. {
  20. Make(name);
  21. }

  22. void Start () {
  23. PrintGMDelegate dele1;
  24. dele1 = PrintCN;
  25. dele1 += PrintEN;
  26. dele1 -= PrintCN;
  27. //PrintDelegate("Jackie",dele1);
  28. dele1("Jackie");
  29. }



 

  1. //**************************************************************************
  2. //
  3. //Delegate: Sender - receiver模型
  4. //
  5. //**************************************************************************
  6. using UnityEngine;
  7. using System.Collections;

  8. public delegate void Pt();
  9. public class Sender
  10. {
  11. public event Pt apt;
  12. public void DO()
  13. {
  14. apt();
  15. }
  16. }

  17. public class Receiver
  18. {
  19. public void Receiving()
  20. {
  21. Debug.Log("i got it");
  22. }
  23. }

  24. public class TestDelegate : MonoBehaviour {
  25. public void Start()
  26. {
  27. Sender sender = new Sender();
  28. Receiver receiver = new Receiver();
  29. sender.apt += receiver.Receiving;
  30. sender.DO();
  31. }
  32. }

 

  1. //**************************************************************************
  2. //
  3. //Delegate: Sender - receiver + EventArgs模型
  4. //
  5. //**************************************************************************
  6. using UnityEngine;
  7. using System.Collections;
  8. using System;

  9. public delegate void PtHandler(MyArgs e);
  10. public class Sender
  11. {
  12. public PtHandler apt;
  13. public void DO(MyArgs e)
  14. {
  15. apt(e);
  16. }
  17. }

  18. public class MyArgs:EventArgs
  19. {
  20. public int num;
  21. public MyArgs(int tmp)
  22. {
  23. num = tmp;
  24. }
  25. }

  26. public class Receiver
  27. {
  28. public void Receiving(MyArgs e)
  29. {
  30. Debug.Log("i got number: "+e.num);
  31. }
  32. }

  33. public class TestDelegate : MonoBehaviour {
  34. public void Start()
  35. {
  36. Sender sender = new Sender();
  37. Receiver receiver = new Receiver();
  38. MyArgs e = new MyArgs(10);
  39. sender.apt += receiver.Receiving;
  40. // sender.DO(e);
  41. sender.apt(e);
  42. }
  43. }

 

 

 

 



 

  1. //**************************************************************************
  2. //
  3. //Delegate: Sender - receiver + Hashtable 
  4. //任意数量的参数,只有返回值格式的限制,没有参数的限制
  5. //
  6. //**************************************************************************
  7. using UnityEngine;
  8. using System.Collections;
  9. using System;

  10. public delegate void PtHandler(Hashtable e);
  11. public class Sender
  12. {
  13. public PtHandler apt;
  14. public void DO(Hashtable e)
  15. {
  16. apt(e);
  17. }
  18. }


  19. public class Receiver
  20. {
  21. public void Receiving(Hashtable e)
  22. {
  23. Debug.Log("i got number: "+e["num"]);
  24. }
  25. }

  26. public class TestDelegate : MonoBehaviour {
  27. public GameObject obj;
  28. public void Start()
  29. {
  30. Sender sender = new Sender();
  31. Receiver receiver = new Receiver();
  32. sender.apt += receiver.Receiving;
  33. Hashtable tab = new Hashtable();
  34. tab["num"] =101;
  35. sender.apt(tab);
  36. }
  37. }

C#委托与代理模式

在设计模式的学习过程中,委托是一个不容易理解的知识点。尤其是在学完代理模式之后,就更不知道什么是什么了。下面分别看一下各自的实例,来看一下这两者有什么区别。       委托是一种引用方法的类型。...
  • zc474235918
  • zc474235918
  • 2014年03月09日 11:13
  • 3417

Unity3D 利用C#实现简单的代理模式Delegate(委托)

Ref: http://www.cnblogs.com/shadow7/p/5892641.html 1、Delegate是什么? Delegate中文翻译为“委托”。 C#语言是支...
  • xlx921027
  • xlx921027
  • 2017年02月26日 00:02
  • 756

C#多线程中使用代理(委托)

net2.0以后,微软加强了控件的安全机制,不允许跨线程操作。     如果想跨线程操作控件的话要使用委托。   以前有过相关学习,后来既不清了,看了一遍之前写的文章,觉得太烂了,重新总结一下:...
  • Baple
  • Baple
  • 2014年03月19日 12:43
  • 3308

C#的委托与java的代理

C#中的委托和JAVA的代理激烈
  • BigWatermelon11
  • BigWatermelon11
  • 2016年11月17日 16:40
  • 1122

C#中的代理委托和event关键字

也叫作委托。事实上,代理就是用于定义指向方法的引用。 比如你在你眼前的程序中要调用另一部分程序的内容(方法或属性),但是,你不能保证函数名或者属性名不发生变化,或者根本程序不可见(不是public或...
  • define_us
  • define_us
  • 2016年06月16日 20:24
  • 642

c# 委托与多线程

很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程。public void ThreadProc();Thread thread = new Thread(...
  • lekelaier_msn
  • lekelaier_msn
  • 2007年06月24日 09:51
  • 6484

C# 委托代理动态的方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Con...
  • cvMat
  • cvMat
  • 2016年12月18日 09:52
  • 1021

C#委托更新进度条 delegate

建立委托 public delegate void DJinDuBar(ProgressBar JDBar, int value,int max);   执行 private void JDuBar...
  • luckypeng
  • luckypeng
  • 2013年10月29日 11:13
  • 1672

在C#中使用代理的方式触发事件 (委托和事件 )

 事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件。所谓事件就是由某个对象发出的消息。比如用户按下了某个按钮,某个文件...
  • maliang1225
  • maliang1225
  • 2007年07月18日 11:04
  • 2590

理解C# 中委托的含义

委托:是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他...
  • xjywt123
  • xjywt123
  • 2016年03月03日 20:41
  • 154
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#委托与代理
举报原因:
原因补充:

(最多只允许输入30个字)