C#中delegate的机制原理
来源:互联网 发布:所罗门矩阵刘少丹违法 编辑:程序博客网 时间:2024/06/01 18:49
C#下的关键字delegate实际上是告诉编译器生成一个继承自MulticastDelegate的密封类。而该类的主要职责是创建函数的回调环境。
而生成的密封类定义如下:
namespace DefineNameSpace{public delegate string DefineDelegate(bool a, bool b, bool c);public class OtherClassOne{ public DefineDelegate myDelegate;}public class OtherClassTwo{}}
编译器实际会生成:
namespace DefineNameSpace{public sealed class DefineDelegate :System.MulticastDelegate{ public string Invoke(bool a, bool b, bool c); public IAsyncResult BeginInvoke(bool a, bool b, bool c, AsyncCallback cb, object state); public string EndInvoce(IAsyncResult result);}public class OtherClassOne{ public DefineDelegate myDelegate;}public class OtherClassTwo{}}
另外,MulticastDelegate类和Delegate类的定义如下:
public abstract class MulticastDelegate : Delegate{ //添加到委托的方法列表 public sealed override Delegate[] GetInvactionList(); //重载操作符 public static bool operator == (MulticastDelegate d1, MulticastDelegate d2); public static bool operator != (MulticastDelegate d1, MulticastDelegate d2); //用来在内部管理委托所维护的方法列表 private IntPtr _invocationCount; private object _invocationList;}
Delegate类的定义如下:
public abstract class Delegate : ICloneable, ISerializeable{ //与函数列表交互的方法 。。。Combine。。。 。。。Remove。。。 。。。RemoveAll。。。 //扩展委托目标的属性 public MethodInfo Method {get;}//反射,委托所维护的静态方法或实例方法的信息 public object Target {get;}//只有委托的方法定义在类实例时不为null,代表委托方法的对象。}
对委托 DefineDelegate 的说明:
- 声明一个委托,实际上是创建了一个类,这个类继承自MulticastDelegate。
- 需要使用委托,必须在某个类的内部顶一个一个该委托类的委托实例或委托对象。例如OtherClassOne里的实例定义:public DefineDelegate myDelegate;。
- Invoke为同步调用方法。返回值与参数列表与用delegate关键字定义时一致。由于一个委托对象可以维护一个委托方法列表,并通过操作符+=进行添加,所以Invoke会依次调用添加到委托实例的方法列表。
- BeginInvoke和EndInvoke为一对操作,在对委托进行异步调用的时候使用。
对委托 DefineDelegate 异步调用的说明:
- 调用一个委托对象的BeginInvoke方法时,系统会为该对象创建一个工作线程,并在该线程内调用委托对象所维护的方法列表。
- 主调线程代码应该创建一个AsyncCallback的委托对象传递给BeginInvoke。如以下代码所示:
private void someMethod() { ... ... AsyncCallBack delegateCb = new AsyncCallback(this.invokeComplete); string completeInfo = "delegate async handle over"; myDelegate.BeginInvoke(ParamsList..., delegateCb, completeInfo);//将会在另一个线程中进行处理 ... ... } private void invokeComplete(IAsyncResult result) { AsyncResult ar = (AsyncResult)result; DefineDelegate tmpDelegate = (DefineDelegate)ar.AsyncDelegate; string delegateResult = tmpDelegate.EndInvoke(result);//获取委托方法的处理结果 string completeInfo = (string)result.AsyncState;//传入BeginInvoke的state参数 }
1 0
- C#中delegate的机制原理
- 在C++中实现C#的delegate机制
- 在C++中实现C#的delegate机制
- C#中Delegate和Event的实现原理以及用法。
- C#中delegate的应用
- C#中的Delegate机制(Delegate in C#)
- C#中Delegate类的使用
- C#中Delegate的效率问题
- 介绍一下C#中delegate的应用
- C#中Delegate委托的使用
- C#中delegate的简单用法
- C#中Delegate浅析
- 关于C#中Delegate
- C#中Delegate
- C#中委托(Delegate)
- C# 的 Delegate Type
- C# 的 Delegate Type
- C#的委托 delegate
- 黑马程序员-iOS基础-Objective-C基础(四)
- Android网络编程之使用HttpClient进行Get方式通信
- FishiGUI:全局变量和单件模式及其内存释放
- hadoop2.5.2+zookeeper3.4.6+hbase0.99.2
- 没钱也能上京东头条-《老码说编程之玩转Swift江湖》一书做到了
- C#中delegate的机制原理
- 正则基础之——捕获组(capture group)
- Python 安装部署 及 工程发布 Chapter.01 python 安装部署
- 英语中的“植物”喻人
- 1.根据字体多少使UILabel自动调节尺寸 2.跑马灯
- iOS 之OC内存管理(一)
- 机器学习和分布式并行计算大家Leslie Valiant获得2010年图灵奖
- 视频会议的发展宗旨 一切为了方便
- 实验四(2) 5阶幻方