读书笔记—CLR via C#章节11-13
前言
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享
事件
- 事件的本质
- 初始化为null的私有委托字段
- 封装add_Event和remove_Event方法
- add_Event和remove_Event的可访问性同Event字段的可访问性,包括virtual和static修饰
- 事件的编码建议
- 使用virtual void OnXXX来定义事件的调用
- 如果对象向事件注册一个方法,对象便不可垃圾回收。所以最好在dispose中注销事件
- 事件调用的优化过程
- if(Event!=null) Event(this,e); 事件变量的线程竞态问题
- 复制到临时变量, EventHandler<EventArgs> temp = Event; if(temp!=null) temp(this, e)
- 以上代码可能会被内联代码优化掉,所以保险一点,考虑下一条
- EventHandler<EventArgs> temp = Interlocked.CompareExchange(ref Event, null, null); if(temp!=null) temp(this, e);
- 试图删除一个从未添加过的方法,Delegate的Remove方法内部不做任何事情
- add和remove方法用线程安全的一个已知的模式更新一个值
- 手动实现事件包装器的关键在于,使用容器存储键和委托列表 Dictionary<EventKey, Delegate> m_events
- EventHandler<T>在老版本中T约束为EventArgs,新版本去除了此种约束
- 允许显式定义事件 EventHandler<T> Handler { add { events += value; } remove{ events -= value;} }
- 事件默认同步执行委托列表,并且任何一个委托出现异常会终止执行
泛型
- 开放类型定义的静态构造函数和静态字段,在封闭类型之间不会共享
- 为了缓解代码爆炸,CLR提供了优化
- 编译器为引用类型的泛型的编译代码时可以共享的
- 值类型则不可以,每个值类型对应一份不同的JIT编译代码
- 泛型接口可以缓解装箱操作,并且不会丧失类型的安全性。如IEquable泛型接口
- 泛型约束struct不兼容可空类型Nullable
协变和逆变
- 协变和逆变泛型类型参数在分配和使用泛型类型方面提供了更大的灵活性
- 利用协变类型参数,可以执行非常类似于普通的多态性的分配
- 通常,协变类型参数可用作委托的返回类型,而逆变类型参数可用作参数类型
- 对于接口,协变类型参数可用作接口的方法的返回类型,而逆变类型参数可用作接口的方法的参数
- 泛型接口或泛型委托类型可以同时具有协变和逆变类型参数
- 变体不适用于委托组合
- Func 泛型委托(如 Func<T, TResult>)具有协变返回类型和逆变参数类型。 Action 泛型委托(如 Action<T1, T2>)具有逆变参数类型
- 实际上数组(只支持object[] = string[] 不支持 object[] = int[]. 值类型数组没有协变)和委托方法签名,已经具备协变和逆变
- 只有在编译器能验证类型之间存在一个引用转换的前提下,才能应用这些可变性
- 由于需要装箱,值类型不具备这种可变性。泛型类型针对值类型不具备可变性
- 对于实参使用out或ref关键字的方法,不允许可变性
接口
- 实现接口的方法必须是公共的
- CLR默认将该方法生成为virtual和sealed,如果显式指定virtual,可以为非密封
- 在一个对象上调用一个接口方法(使用对象类型调用),将调用该方法在该对象的类型中的实现
- 将值类型转型为接口类型,会发生装箱
- 显式接口实现不允许指定可访问性,自动设为private,调用接口方法必须通过接口类型变量来进行
- EIMI方法不能标记为virtual,所以不能被重写,因为EIMI方法并非真的是类型对象模型的一部分
- 对于接口泛型约束,C#编译器会生成特定的IL指令,这些指令导致直接在值类型上调用接口方法,不对其进行装箱
- 如果不适用接口约束,就没有其他方法让编译器生成这些IL指令,如此一来,在值类型上调用接口方法总是会造成装箱
- 如果继承多个接口,而接口又有相同名称和签名的方法,必须使用显式接口方法实现
- EIMI只能通过接口调用,并且不能由派生类调用。EIMI应该慎用
读书笔记—CLR via C#章节11-13的更多相关文章
- 读书笔记—CLR via C#章节3
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...
- 读书笔记—CLR via C#章节8-10
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节4-7
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节1-2
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...
- 《C#从现象到本质》读书笔记(九)第11章C#的数据结构
<C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...
- 读书笔记—CLR via C#线程27章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#同步构造28-29章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#异常和状态管理
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
随机推荐
- hexo 部署至Git遇到的坑
查找资料的时候发现了next这个博客主题,next!非常的漂亮,顺手查看了hexo的相关部署. Hexo官方介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲 ...
- hdu4705 Y 简单树形DP 2013多校训练第十场 J题
题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...
- 2014在百度之星资格赛的第四个冠军Labyrinth
Problem Description 熊度仅仅是一种冒险的熊,一个偶然落入一个m*n迷宫矩阵,能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫.每一次仅仅能走一格,且仅仅能向 ...
- webservice发送字符串
假设只是发送一个字符串client,这是很easy,只需要输入xfire包,编写接口,编写的实现方法.变化. 假设你要传输的数组或自定义类.到用于接口准备的需要agexis文件.更复杂. 尝试传输这些 ...
- ROOT android 原理。 基于(zergRush)
出自: http://bbs.gfan.com/android-2996211-1-1.html 须要ROOT的同学请去上面的地址下载. a.控制手机创建个暂时目录,然后把zergRush脚本写入此目 ...
- DeviceIOControl具体解释-各个击破
DeviceIoControl这个api我们用的不多,可是非常重要,有时会帮助我们实现一些特别的需求, 如获取硬件设备信息.与硬件设备通信(读写数据)等,对比msdn,以下我们详解一下这个api的使用 ...
- C语言qsort函数算法性能测试
对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...
- 优秀的前端project如何制定一个老师--html学习路径
一个好的前端project教师发展,不是一蹴而就,它需要大量的学习和积累. 至于谁刚开始学习的人,如何入门.学习如何选择我的路线,做了各种工具? 1. 学习之前 1.不要着急看一些复杂网页效果的代码 ...
- Cocos2d-xvision3.0加载失败,和,Vs2012环境搭建
1.安装好VS2012,下载Cocos2d-x3.0 双击击win32 sln运行VS2012 如果加载失败点击程序运行,输入devenv.exe /resetuserdata 回车,然后再进入VS, ...
- 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...