1.委托揭秘

定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类.

由于委托是类,所以能定义类的地方,都能定义委托.

委托内部有一个target字段,指向调用的实例,如果是静态方法,为null;_methodInfo指向调用的方法.invocationList包含所有定义的委托链.

在调用委托时,实际调用的是委托实例的Invoke方法.如:delegate a,a(value),实际是a.Invoke(value).  a实际是一个类实例.

委托的Remove方法只会删除找到的第一个匹配对象,不会删除所有匹配的对象.

+=和-=实际调用的是Delegate.Combine和Remove方法.

委托内部在调用委托链时是按照顺序调用的,加入有一个方法出了异常,会导致后续委托不能运行.MulticastDelegate提供了一个实例方法GetInvocationList,获取所有的委托方法,可以显示调用并捕获异常.可以不适用Invoke方法.

Lambda表达式在编译之后会生成一个方法.此方法会被加上System.Runtime.CompilerServices.CompilerGeneratedAttribute标记.匿名方法被标记为private.

Lambda表达式可以 有多个输入参数.

Delegate.CreateDelegate和DynamicInvoke能够处理后期绑定的委托,编译时不知道委托要调用的方法和实例等信息,可以使用此方法,通过反射的方式获取实例和委托要调用的方法.

2. Attribute

Attribute.IsDefined检查是否定义了某个Attribute,效率要高于Attribute.GetCustomAttribute,Attribute.GetCustomAttributes,他不会构造Attribute的实例,另外两个方法会构造并返回Attribute的实例.

System.Attribute重写了Object的Equal方法,在判断两个Attribute是否相等的时候,先检查类型是否相同,在检查Attribute中的每个字段值是否相等.另外,自己可以重写此方法,达到自己的效果.

CustomAttributeData.GetCustomAttributes,返回CustomAttributeData类型的值,这些对象表示有关已应用于目标程序集的属性的数据.而不会返回Attribute的实例,也就不会执行Attribute的构造器方法等方法.CustomAttributeData中包含了Attribute类的反射信息.

条件Attribute   System.Diagnostics.ConditionalAttribute指示编译器应忽略方法调用或属性,除非已定义指定的条件编译符号。只有在定义了指定的符号的时候,才会编译此方法.

3. Nullable

空接合操作符 ??如果左边的数不为null,就返回这个值,为null,就返回汇编的值.可以方便的设置默认值.可用于值类型和引用类型.

可空值类型在调用Gettype的时候,返回的是T的类型,就是其中保存的值的类型.

第十七章 委托 第十八章 Attribute 第十九章 可空值类型的更多相关文章

  1. “全栈2019”Java第十八章:一元运算符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Flask 教程 第十九章:Docker容器上的部署

    本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...

  3. Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. 《linux内核设计与实现》第十八章

    第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 一.准备开始 1.内和调试需要什么 一个bug(大部分bug通常都不是行为可靠而且定义明确的) 一个藏匿bug的内核版本(知道 ...

  5. 《Linux内核设计与实现》第十八章学习笔记

    第十八章 调试 [学习时间:1小时 总结博客时间:1小时15分] [学习内容:出现bug的原因.内核调试器gdb.使用Git进行二分查找] 内核级开发的调试工作远比用户级开发艰难,它带来的风险比用户级 ...

  6. Linux内核分析——第十八章 调试

    第十八章    调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...

  7. TCP/IP详解 卷1 第十八章 TCP的建立与终止

    第十八章 TCP的建立与终止 tcpdump Tcpdump可以将网络中传送的数据报完截获下来进行分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉 ...

  8. “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. linux第十八章学习笔记

    第十八章 调试 内核级开发的调试工作远比用户级开发艰难,它带来的风险比用户级别更高. 一.准备开始 1. 准备工作需要: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在用户级 ...

随机推荐

  1. windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释

    看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE);  // 系统默认 ...

  2. Xamarin android PreferenceActivity 实现应用程序首选项设置(一)

    应用程序首选项屏幕 类似系统设置界面. PreferenceActivity 是另一种类型的Activity,通过PreferenceActivity 可以以最少量的工作显示某些Preference列 ...

  3. 你可以用OpenCV来干什么

    本文翻译自开源图书“OpenCV by Example”中第1章中的“What can you do with OpenCV?”小节. 使用OpenCV,你几乎可以做任何你能够想到的计算机视觉任务.现 ...

  4. 【ASP.NET+MVC4+Web+编程】读书笔记

    模型:数据和业务逻辑 视图:展示 控制器:接收视图输入数据,通过模型层业务逻辑处理后 返回给视图 分离关注点(模型 视图 控制器).惯例优先原则 browser-->routing-->c ...

  5. what is the virtual machine, when and why we need use it ?

    虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件,你可以在一台物理计算机上模拟出二台或多台虚拟的计算机,这些虚 ...

  6. Angularjs 通过WebApi 下载excel

    如果想知道 AngularJs 通过WebAPI 下载Excel.请看下文,这里仅提供了一种方案. 服务器端代码如下: protected HttpResponseMessage GenereateE ...

  7. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  8. webx学习笔记

    Webx学习笔记周建旭 2014-08-01 Webx工作流程 图 3.2. Webx Framework如何响应请求 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两 ...

  9. ios 8和iOS 9 适用的uidatepicker

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n ...

  10. Dapper使用方法

    这里记下Dapper容易忘的使用方法: 返回的数据可以有相同名称的列,会分配到不同的类上,默认使用Id这个列作为分割列 connection.Open();  //手动打开的话会保持长连接,否则每次查 ...