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. [EAP]将hostapd作为radius服务器搭建EAP认证环境

    文章主要由以下几部分组成: 0.概念理解: WPA/WPA2,EAP,IEEE, 802.11i, WiFi联盟, 802.1x 1.编译hostapd 2.配置hostapd的conf文件 3.外接 ...

  2. Mongodb学习使用记录

    在学习使用Mongodb中,对map和reduce的定义,以及对 mapReduce() 方法的调用: >map #在直接输入map时会出现一个'map is not defined'的异常错误 ...

  3. php检查漏洞防护补丁-防护XSS,SQL,文件包含等多种高危漏洞

    /** * 通用漏洞防护补丁 * 功能说明:防护XSS,SQL,代码执行,文件包含等多种高危漏洞 * Class CheckRequestServer */ class CheckRequestSer ...

  4. laravel--belongsTo关联

    1.第一个是要引入的模型类 格式这样 belongsTo 第二个参数是拿自己这个模型表的 哪个字段 去匹配 要关联的qualified表里的哪个ID 默认是拿qualified_id去匹配,前面的是对 ...

  5. php数组去重的函数代码

    php中数组去重的小例子.  代码如下: <?php   /** * 数组去重复的小函数 * by www.jbxue.com */     function assoc_unique($arr ...

  6. epoll_create, epoll_ctl和epoll_wait

    参考代码 #include <iostream> #include <sys/socket.h> #include <sys/epoll.h> #include & ...

  7. [翻译]15个最常见的WCF面试问题

    WCF和ASMX WebService的区别是什么? 最基本的区别在于,ASMX或者ASP.NET WebService是用来通过基于HTTP的SOAP来实现通讯.但WCF可以使用任意协议(HTTP, ...

  8. 1048. Find Coins (25)

    时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves to collect coins from a ...

  9. 在Linux中,如何取出一个字符串的前5位

    问: 在Linux中,如何取出一个字符串的前5位? 常用的一些方法如下: [tough@toughhou ~]$ str=abcdef [tough@toughhou ~]$ echo $str ab ...

  10. linux ssh 安装、安全设置

    环境:ubuntu 12.04   一.简单安装设置 1. 安装ssh 服务器 $ sudo apt-get install openssh 2. 查看运行状态 $ service ssh statu ...