第十七章 委托 第十八章 Attribute 第十九章 可空值类型
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 第十九章 可空值类型的更多相关文章
- “全栈2019”Java第十八章:一元运算符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...
- Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 《linux内核设计与实现》第十八章
第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 一.准备开始 1.内和调试需要什么 一个bug(大部分bug通常都不是行为可靠而且定义明确的) 一个藏匿bug的内核版本(知道 ...
- 《Linux内核设计与实现》第十八章学习笔记
第十八章 调试 [学习时间:1小时 总结博客时间:1小时15分] [学习内容:出现bug的原因.内核调试器gdb.使用Git进行二分查找] 内核级开发的调试工作远比用户级开发艰难,它带来的风险比用户级 ...
- Linux内核分析——第十八章 调试
第十八章 调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...
- TCP/IP详解 卷1 第十八章 TCP的建立与终止
第十八章 TCP的建立与终止 tcpdump Tcpdump可以将网络中传送的数据报完截获下来进行分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉 ...
- “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- linux第十八章学习笔记
第十八章 调试 内核级开发的调试工作远比用户级开发艰难,它带来的风险比用户级别更高. 一.准备开始 1. 准备工作需要: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在用户级 ...
随机推荐
- Poj OpenJudge 1068 Parencodings
1.Link: http://poj.org/problem?id=1068 http://bailian.openjudge.cn/practice/1068 2.Content: Parencod ...
- iOS 非ARC基本内存管理系列 1-引用计数器
1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量 ...
- 隐藏win7盘符
1.隐藏盘符: //新建注册表,隐藏X盘符 int regeditme() { HKEY hkey; DWORD dwLastError= ;//隐藏X盘2^25 J:2^9=512 X:盘符与挂载的 ...
- 【转】winform与web 按钮button去掉边框
ref:http://blog.csdn.net/wangzh300/article/details/5264316 WinForm的话 设置Button属性的FlatStyle为Flat,并且设置F ...
- jQueryr .on方法解析
.On() 其实.bind(), .live(), .delegate()都是通过.on()来实现的,.unbind(), .die(), .undelegate(),也是一样的都是通过.off()来 ...
- 配置tomcat时踩过的坑
conf/server.xml文件有2处地方容易踩坑: 1.<HOst>标签中的appBase名字,要看清,有些修改的版本,会把这个名字改成deploy,而eclipse默认部署的是web ...
- 淘宝IP地址库API接口(PHP)通过ip获取地址信息
淘宝IP地址库网址:http://ip.taobao.com/ 提供的服务包括: 1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 2. 用 ...
- 《C和指针》 读书笔记 -- 第9章 字符串、字符和字节
1.字符串以NUL结尾,但字符串长度不包括NUl字节. 2.复制字符串 char *strcpy(char *dst,char const *src); 3.连接字符串 char *strcat(ch ...
- 关于FileSystemWatcher监听文件创建
FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...
- HttpClient抓取网页内容简单介绍
版本HttpClient3.1 1.GET方式 第一步.创建一个客户端,类似于你用浏览器打开一个网页 HttpClient httpClient = new HttpClient(); 第二步.创建一 ...