delegate,C#,代理

转载 2007年09月26日 19:26:00
在学习多线程的过程中,又遇到了一个问题:C#代理.上网查了些资料,对代理有了一个初步的认识,记一点笔记.

    C#代理实际上类似于C++中的函数指针,因为C#中不存在指针,所以用代理可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。 

    实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:
1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。 
    声明一个代理的例子:
    public delegate int MyDelegate(string message);

2. 创建delegate对象,并将你想要传递的函数作为参数传入。 
     创建代理对象的方法:
    1). MyDelegate myDelegate = new MyDelegate(实例名.方法名);
    2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
注:如果需要代理的方法是一个static静态方法的话,采用第2种方式,否则采用第1种方式。

3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。 
    可以直接使用代理调用代理所指向的方法:
    myDelegate(向方法传递的参数);

    下面是一些需要注意的事情:
“代理”(delegate)(代表、委托):“代理”是类型安全的并且完全面向对象的。
1)在C#中,所有的代理都是从System.Delegate类派生的(delegateSystem.Delegate
的别名)。
2)代理隐含具有sealed
属性,即不能用来派生新的类型。
3
)代理最大的作用就是为类的事件绑定事件处理程序。
4)在通过代理调用函数前,必须先检查代理是否为空(null),若非空,才能调用函数。5
)在代理实例中可以封装静态的方法也可以封装实例方法。
6)在创建代理实例时,需要传递将要映射的方法或其他代理实例以指明代理将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.
方法名。
7
)只有当两个代理实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。
8)多个代理实例可以形成一个代理链,System.Delegate中定义了用来维护代理链的静态方法CombionRemove
,分别向代理链中添加代理实例和删除代理实例。
9)代理的定义必须放在任何类的外面,如delegate int MyDelegate();而在类的方法中调用MyDelegate d = new MyDelegate(MyClass.MyMethod)
;来实例化自定义代理的实例。
10
)代理三步曲:
a.生成自定义代理类:
delegate int MyDelegate();
b.然后实例化代理类:MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最后通过实例对象调用方法:int ret = d();
 
 

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

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

C# 代理 delegate +=的本质

C# 代理或事件中会使用到+=方法注册事件,通过IL查看其本质是使用了System.Delegate.Combine方法 SayDele += new SaySomeDele(SayhelloMet...
  • ISaiSai
  • ISaiSai
  • 2013年07月10日 17:35
  • 4453

在C++中实现委托(Delegate)

原文地址 个人理解: 说明: 最近在阅读设计模式相关的内容, 正好看到观察者模式的部分, 发现.net 有一个委托机制, 本质上就是函数指针对象。 这篇大作中...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年03月18日 21:04
  • 2546

C#设计模式之代理类的例子

 C#引入了C语言中的一个独特属性,叫做代理,代理本质上是对另一个类中的函数的引用,可以分派和使用函数而无需要知道它来自哪一个类 ,只要函数满足同样的接口就可以.下面这个例子很简单,功能就是实现一串字...
  • stone0419
  • stone0419
  • 2007年10月17日 21:08
  • 2939

iOS中delegate代理对象使用weak

之前不停应用的是assign,本日调试一段代码的时间,发明顺序会crash失落,报错EXC_BAD_ACCESS 经由一番研讨,发明若是应用 @property (nonatomic, assign,...
  • helloworld_junyang
  • helloworld_junyang
  • 2016年03月31日 08:43
  • 1786

C++实现代理(delegate)

记不清出处了,实现代码是别人的,自己整理的 //delegate.h /*! @file @author Albert Semenov @date 11/2007 @module */ /* ...
  • xiaoxiaoyusheng2012
  • xiaoxiaoyusheng2012
  • 2015年05月08日 20:56
  • 924

C#委托更新进度条 delegate

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

Datasource 与 Delegate的对比

在IOS中常会看到Datasource和Delegate,但是两者有什么区别,很简单。 Datasource是在告诉使用者之前的view中都有什么东西,有什么属性啊,属性的值都是多少,是只关于数据的...
  • naruto900814two
  • naruto900814two
  • 2014年03月10日 13:15
  • 2170

C# 委托代理动态的方法

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

自学QT之代理Delegate

createEditor setEditorData setModelData 这三个函数是要用到的函数。然而按F1居然不能跳转到帮助文档,这算不算bug。 下面这段代码是要实现在一个表格中添...
  • xuancailinggan
  • xuancailinggan
  • 2015年12月20日 14:26
  • 1493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delegate,C#,代理
举报原因:
原因补充:

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