C#中的代理(Delegate)

转载 2006年06月08日 16:44: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();
 

C# 委托代理静态的方法

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

在C#中使用代理的方式触发事件

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

C#设置代理IP及刷网站访问量demo

二话不说先上图: 设置代理ip是参考网上的资料,下面是设置代理ip代码:...
  • wuma0q1an
  • wuma0q1an
  • 2016年05月04日 10:53
  • 3189

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

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

C#中给WebClient添加代理Proxy

效果图:
  • lyh1234
  • lyh1234
  • 2014年06月13日 14:53
  • 2271

c#的委托(代理)和事件

一、代理 首先我们要弄清代理是个什么东西。别让一串翻译过来的概念把大家搞晕了头。 有的文章把代理称委托、代表等,其实它们是一个东西,英文表述都是“Delegate”。由于没有一本权威的书来规范...
  • xiangxiang123123
  • xiangxiang123123
  • 2013年03月06日 13:18
  • 13277

C#设置IE代理

首先,我想通过修改注册表来设置IE代理。 以下是修改注册表的代码: [csharp] view plaincopy //打开注册表   Mi...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2015年09月06日 18:25
  • 613

C#中动态代理与泛型函数

上文中介绍了Java中的动态代理(http://blog.csdn.net/tanzhangwen/article/details/47725967),那么如果我想要用C#实现类似的功能该如何处理呢?...
  • tanzhangwen
  • tanzhangwen
  • 2015年09月06日 09:40
  • 1456

采集代理IP网站上的代理IP

///         /// 用正则表达式进行取IP         ///         private void GetIp(string Ips)         {     ...
  • zky0901
  • zky0901
  • 2015年10月24日 15:16
  • 1177

c#换ip代理源码

很多朋友都想如何提高自己的网站流量,可是都没有什么好的办法 经过很长时间的研究,在C#中实现了,当然了,这部分代码其中一部分是网上的,不是原创。 using System; using ...
  • zky0901
  • zky0901
  • 2015年03月07日 16:23
  • 2732
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中的代理(Delegate)
举报原因:
原因补充:

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