协变性和逆变性

协变性是指方法能返回从委托返回类型派生的一个类型。

逆变性是指获取的参数可以是委托参数类型的基类。

举个例子吧,看以下定义的委托,以及方法。

delegate Object MyCallBack(FileStream fs);

 以下方法可以绑定该委托

String SomeMethod(Stream s);

 在该方法中返回类型String是Object的派生子类,这种协变性是允许的。

方法参数Stream是委托参数FileStream的基类,这种逆变性也是允许的。

但是要注意的是:协变性与逆变性只能应用于引用类型,不能应用于值类型和void,所以,以下方法不能绑定到MyCallBack委托。

Int32 SomeOtherMethod(Stream s);

我们再来定义一个委托:

internal delegate void Feedback(Int32 value)

你一定很想了解内部编译器生成了什么吧?编译器会定义如下一个完整的类。

 internal class FeedBack:System.MulticastDelegate
{
public FeedBack(Object object,InPtr method); public virtual void Invoke(Int32 value); public virtual IAsyncResult BeginInvoke(Int32 value,AsyncCallback callback,Object object); public virtual EndInvoke(IAsyncResult result); }

所有委托类型均派生自MulticastDelegate这个类型,后者又派生自Object。

由于所有委托类型均派生自MulticastDelegate,所以继承了MulticastDelegate的方法、字段和属性。

其中三个属性我们需要注意,非常重要。

_target:      这是一个Object类型的字段,当委托包装的是一个静态方法时,值为null,当委托包装一个实例方法时,这个字段引用的是回掉方法要操作的对象,换言之,这个字段       指出要传给实例方法的隐式参数this的值。通俗来说,就是当委托包装为一个实例的时候,这个字段保存的是实例方法的对象。

_methodPtr: 一个内部的整数值,CLR用它来标识要回调的方法

_invocationList: 该字段通常为Null,构造一个委托链时,它可以引用一个委托数组。

 

CLR读书笔记——委托的更多相关文章

  1. CLR 读书笔记

    http://www.cnblogs.com/wang_yb/tag/CLR%20via%20C%23%E7%AC%94%E8%AE%B0/

  2. 《CLR via C#》读书笔记 之 泛型

    第十二章 泛型 2014-06-15 初始泛型 12.3 泛型基础结构 12.3.1 开放类型与封闭类型 12.3.2 泛型类型和继承 12.3.3 泛型类型同一性 12.3.4 代码爆炸 12.6 ...

  3. 《CLR via C#》读书笔记 之 计算限制的异步操作

    <CLR via C#>读书笔记 之 计算限制的异步操作 2014-07-06 26.1 CLR线程池基础 返回 如25章所述,创建和销毁线程是一个比较昂贵的操作: 太多的线程也会浪费内存 ...

  4. 《C#图解教程》读书笔记之五:委托和事件

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执 ...

  5. 认识CLR [《CLR via C#》读书笔记]

    认识CLR [<CLR via C#>读书笔记] <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runti ...

  6. CLR基础之一---认识CLR [《CLR via C#》读书笔记]

    <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称.这 ...

  7. 《CLR Via C#》读书笔记,持续更新...

    写了快5年代码了,一直都是使用别人发明的语言,别人发明的框架做快速开发,还从来没有真正深刻的学习过底层的一些东西,于是今年我打算读<CLR Via C#>这本书,认识一下C#的底层,我觉得 ...

  8. 《CLR via C#》读书笔记(一)——CLR的执行模式

    前言 万事开头难,很早之前就想写博客记录些东西,迟迟未行动,甚是遗憾.原因诸多,大体上无非都是懒.没意志力等等.这次从自己的读书笔记开始,兴许能够有所改变. 一.CLR概念 CLR(Common La ...

  9. 《C#从现象到本质》读书笔记(六)第8章委托和事件

    <C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...

随机推荐

  1. mysql----innodb统计信息

    对innodb 统计信息的控制可以通过如下几个常用的variables 来实现 1.innodb_stats_persistent: 这个参数控制着innodb的统计信息是否持久化到磁盘,先说明一下持 ...

  2. mysql 性能分析套件

    #!/usr/local/python3./bin/python3. #!coding:utf- #################################### #目地:用于诊断mysql性 ...

  3. 玩sdr的朋友们,在rtl_tcp时,记得调整rtl_AGC和tuner_AGC啊

    我在rtl_tcp时没有调整这个,结果怎么也听不到声音啊 还有就是在搞rtl_tcp时,一定要网速跟得上,我用无线网络时就碰到了这个问题,声音总是一直断续着,郁闷死

  4. Linux下的命令行上网

    对于网页浏览器现在大多数人用links/elinks,对了,还有个老牌一点的文本浏览器Lynx,links/elinks也是从Lynx中fork出来的. 以上所说的虽然能字符界面来浏览网页,但是不能显 ...

  5. Jedis超时时间设置梳理

    JedisConnectionException: Unexpected end of stream #932 Repeatable exception and for the life of me, ...

  6. cf479E Riding in a Lift

    E. Riding in a Lift time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. codecomb 2086【滑板鞋】

    题目背景 我的滑板鞋时尚时尚最时尚 回家的路上我情不自禁 摩擦 摩擦 在这光滑的地上摩擦 月光下我看到自己的身影有时很远有时很近 感到一种力量驱使我的脚步 有了滑板鞋天黑都不怕 题目描述 你在魅力之都 ...

  8. HDU 1559 最大子矩阵 (DP)

    题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...

  9. CodePen&#39;s CSS

    p{text-indent:2em;}前端开发whqet,csdn,王海庆,whqet,前端开发专家 翻译自:CodePen's CSS 翻译人员:前端开发whqet,意译为主.不当之处欢迎大家指正. ...

  10. ios9基础知识(技能篇)

    NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...