C#代理深入研究
作者:网络转载 发布时间:[ 2012/8/16 11:13:56 ] 推荐标签:
fbInstance.Invoke(1);
但是,C#做了进一步优化,你可以直接通过代理对象来调用其所封装的方法,例如:
fbInstance(1);
三、连接和移除代理对象
前面看到的代理对象都是封装一个方法,实际上,代理对象可以将一系列方法封装成一个链表,这一特性取决于Delegate类的Combine和Remove方法。
fbChain = (Feedback) Delegate.Combine(fbChain, fb1);
实际上,C#对这一用法也提供了优化,可以使用+、+=、-、-=运算符来添加或移除代理对象:
fbChain += fb1;
代理的扩展:事件
C#事件的引入类似属性的引入,属性是对字段的封装,而事件对象是对代理对象的封装。
当定义如下事件时:
public event EventHandler
从上面生成的代码可以看出,事件对象封装了类中的代理对象,并且只暴露出add_xxx和remove_xxx方法(事件对象的+=和-=即调用相应的方法),而外界无法对其封装的代理对象进行额外的操作(构建并初始化代理对象、调用代理对象封装的方法)。
C#编译器实际上会将其转换成如下的代码:
// 1. A PRIVATE delegate field that is initialized to null
private EventHandler
// 2. A PUBLIC add_Xxx method (where Xxx is the Event name)
// Allows methods to register interest in the event.
public void add_NewMail(EventHandler
// The loop and the call to CompareExchange is all just a fancy way
// of adding a delegate to the event in a thread-safe way
EventHandler
EventHandler
do {
prevHandler = newMail;
EventHandler
(EventHandler
newMail = Interlocked.CompareExchange
ref this.NewMail, newHandler, prevHandler);
} while (newMail != prevHandler);
}
// 3. A PUBLIC remove_Xxx method (where Xxx is the Event name)
// Allows methods to unregister interest in the event.
public void remove_NewMail(EventHandler
// The loop and the call to CompareExchange is all just a fancy way
// of removing a delegate from the event in a thread-safe way
EventHandler
EventHandler
do {
prevHandler = newMail;
EventHandler
(EventHandler
newMail = Interlocked.CompareExchange
ref this.NewMail, newHandler, prevHandler);
} while (newMail != prevHandler);
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11