如何实现C 如何实现css代码复用
创始人
2024-05-01 20:20:53
0

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

实现一个C#代理是很简单的,通过以下3个步骤即可实现一个delegate:

1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。

声明一个代理的例子:

  1. 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类派生的(delegate是System.Delegate的别名)。

(2)代理隐含具有sealed属性,即不能用来派生新的类型。

(3)代理最大的作用就是为类的事件绑定事件处理程序。

(4)在通过代理调用函数前,必须先检查代理是否为空(null),若非空,才能调用函数。(5)在代理实例中可以封装静态的方法也可以封装实例方法。

(6)在创建代理实例时,需要传递将要映射的方法或其他代理实例以指明代理将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。

(7)只有当两个代理实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。

(8)多个代理实例可以形成一个代理链,System.Delegate中定义了用来维护代理链的静态方法Combion,Remove,分别向代理链中添加代理实例和删除代理实例。

(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();  0 0 0

这样,就实现了C#代理。

【编辑推荐】

  1. C# winForm自定义鼠标样式的两种方法
  2. C#自定义消息框的设置图解
  3. 掌握C#自定义泛型类:从初始化说起
  4. C#存储过程的循序渐进
  5. 存储过程的优势及其调用方法介绍

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...