Q-->question A-->answer M-->mention
The Chapter 15th Delegate
M:委托非常类似于代表一个函数地址的非托管C/C++ typedef,它就是一系列方法的封装
M:一个委托可以调用另一个类型的私有成员,这样做不会损失安全性和可访问性
Q:何为协变及反协变?
A:协变=>一个方法能返回从委托的返回类型中派生的一个类型.
反协变=>一个方法的参数类型可以是委托参数类型的基类
for example=> delegate Object MyCallback(FileStream fs)
其协变和反协变=> string SomeMethod(Stream s)
当然此对值类型无效,因为其内存结构不同
M:委托封装的方法可以是实例方法,也可以是静态方法,封装实例方法非常有用,意味着对象可以维护一些状态,并可访问对象的实例方法成员
M:定义一个委托时,编译器将会生一个完整的类,其中有4个方法=>一个构造器,Invoke(其原型与定义的委托相同),还有BeginInvoke()和EndInvoke()民步编程模型方法
M:委托是类,其也有可见性,所有委托继承于MulticastDelegate,可以定义类的地方即可定义委托,同时定义时,其内部还有3个重要的非公共成员:
_target => 内部对象的引用,静态方法时为null
_methodPrt => 一个内部整数值,标识要回调的方法
_invocationList => 引用委托数组,通常为空,用于多播委托
note:_methodPtr从元数据标记中获得(MethodDef和MemberDef)