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. 第八章 Qt GUI之对话框使用

    第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...

  2. CCNA第三讲笔记

    TCP/IP可以分为四层或者五层 应用层.传输层.网络层.网络接口层 或者 应用层.传输层.网络层.数据链路层.物理层 与OSI相比 相同点:都有层次结构 不同点:TCP/IP的应用层包含了OSI的应 ...

  3. JS焦点图,JS 多个页面放多个焦点图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. jooml二次开发---添加文章组件

    在写一个joomla组件的时候需要手动添加excel表格,并把表格当做文章的内容添加到前台文章中, 开始不知道怎么下手,索性先把一个基本的组件写出来,在joomla网站上测试是可以访问这个组件的,在p ...

  5. c++空类的大小

    初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们 ...

  6. .NET平台一些概念

    1.什么是CLR CLR(Common Language Runtime)公共语言远行时,是一个可由多种编程语言使用的“远行时”.CLR的核心功能(比如内存管理.程序集加载.安全性.异常处理和线程同步 ...

  7. 《WPF程序设计指南》读书笔记——第6章 Dock与Grid

    1.DockPanel面板 using System; using System.Windows; using System.Windows.Controls; using System.Window ...

  8. 1090. Highest Price in Supply Chain (25)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...

  9. fedora 20 PIL

    今天安装PIL花了我好多的时间. 刚开始,我手动下载PIL原码,编译安装. 启动我的django项目,报下面的错误,完全不懂是么意思. CommandError: One or more models ...

  10. Kinetic使用注意点--circle

    new Circle(config) 参数: config:包含所有配置项的对象. { radius: "半径", fill: "填充色", fillRGB: ...