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. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  2. log4j配置只打印指定jar或包的DEBUG信息

    有的时候查问题的时候需要打印第三方jar里面的debug信息,假如全部jar都打印的话日志文件会很大,这个时候可以配置log4j只打印指定jar的debug信息或者包,同时输出到了一个新的文件中. 比 ...

  3. android源码-安卓源码-Android源码下载-安卓游戏源码

    android源码   高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286  ...

  4. encodeURIComponent=>Uri.EscapeDataString

    javascript: encodeURIComponent=> C#: Uri.EscapeDataString http://stackoverflow.com/questions/5754 ...

  5. Hibernate的单向OneToMany、单向ManyToOne

    单向OneToMany 一个用户有多张照片,User----->Images是一对多关系,在数据库中Images维护一个外键useid 1.在映射关系的主控方Image这边,我们什么都不做.(为 ...

  6. Sublime text2 常用插件集锦

    No.01 – EmmetEmmet 是一个前端开发的利器,其前身是Zen Coding.它让编写 HTML 代码变得简单.Emmet 的基本用法是:输入简写形式,然后按 Tab 键.关于 Emmet ...

  7. php数组去重实例及分析

    php数组去重实例及分析.  一维数组的重复项: 使用array_unique函数即可,使用实例 <?php    $aa=array("apple","banan ...

  8. centos 安装ecshop出现date错误

    centos 安装ecshop 错误提示 Warning: date(): It is not safe to rely on the system's timezone settings. You ...

  9. Spark Streaming揭秘 Day27 Job产生机制

    Spark Streaming揭秘 Day27 Job产生机制 今天主要讨论一个问题,就是除了DStream action以外,还有什么地方可以产生Job,这会有助于了解Spark Streaming ...

  10. C#快速学习笔记(译)

    下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { public static ...