第Ⅴ部分 类型管理
第十八章 异常
异常处理带来的好处:
① 利用异常处理,我们可以将资源清理代码放在一个固定的位置,并且确保它们得到执行。
② 利用异常处理,我们可以将处理异常的代码放在一个集中的位置。
③ 利用异常处理,我们可以很容易定位和修复代码中的BUG。
18.1异常处理的演化
18.2异常处理机制
18.2.1try块
包含的通常是一些需要资源清理或者异常恢复的操作,可能会抛出异常的代码。单独一个try块没有任何意义。
18.2.2catch块
包含的是出现异常时需要执行的响应代码。如果try块没有抛出异常将不会执行。出现在catch关键字后的表达式被称作异常筛选器(exception fukter),表示开发人员预料到的、并且可以从中恢复的一种异常情况,必须是System.Exception或其子类。多个catch是自上而下搜索的。在finally之后才会执行finally块的代码,有三种选择:①重新抛出所捕获的异常。②抛出一个不同的异常。③让线程从catch块的底部退出。
18.2.3finally块
一般是执行资源清理工作。
18.3异常的本质
异常是对程序接口隐含假设的一种违反。
18.4System.Exception类
P.407表17.1System.Exception类型的属性
18.5FCL定义的异常类
P.408-P.409
18.6定义自己的异常类
应该是可序列化的,并实现及调用父类的公有构造参数。
18.7如何正确使用异常
18.7.1避免过多的finally块
使用lock和using语句,使编译器自动产生try块和finally块。
18.7.2避免捕获所有异常
18.7.3从异常中顺利地恢复
18.7.4当异常无法修复时,回滚部分完成的操作
18.7.5隐藏实现细节
18.8FCL中存在的一些问题
18.9性能考虑
18.10捕获筛选器
捕获筛选器就是一个数据类型,会判断抛出的异常类型是否和筛选器指定的类型相匹配。CLR支持复杂的筛选器,但许多语言不支持。CLR会先查找接受被抛出异常的捕获筛选器,然后调用更低层次的堆栈中的Finally块来展开调用堆栈,最后才会执行匹配的catch中的代码。
18.11未处理异常
18.11.1发生未处理异常时的CLR行为控制
18.11.2未处理异常与Windows窗体
18.11.3未处理异常与ASP.NET Web窗体
18.11.4未处理异常与ASP.NET XML Web服务
18.12异常堆栈踪迹
18.12.1远程堆栈踪迹
18.13异常调试
18.13.1告诉Visual Studio调试何种代码
第十九章 自动内存管理(垃圾收集)
19.1垃圾收集平台基本原理解析
访问一个资源的步骤:
① 调用中间语言(IL)中的newobj指令,为某个特定资源的类型实例分配内存空间。
② 初始化上一步所得的内存。
③ 通过访问类型成员来使用资源。
④ 销毁资源状态。
⑤ 释放内存。
19.2垃圾收集算法
19.3终止化操作
尽量避免使用Finalize方法,增加内存压力,分配时间较长,损伤应用程序性能,可能引用其他对象延长他们的生存期,无法很好控制Finalize方法何时执行,CLR不对Finalize方法的执行顺序做任何保证。
19.3.1调用Finalize方法的条件
①第0代对象充满
②显示调用System.GC的静态方法Collect
③CLR卸载应用程序域
④CLR被关闭
19.3.2终止化操作的内部机理
19.4Dispose模式:强制对象清理资源
19.4.1使用实现了Dispose模式的类型
19.4.2C#的using语句
19.4.3一个有趣的依赖问题
19.5弱引用
19.5.1弱引用的内部机理
19.6对象复苏
19.6.1利用复苏设计一个对象池
19.7对象的代龄
19.8编程控制垃圾收集器
19.9其他一些与垃圾收集器性能相关的问题
19.9.1省却同步控制的多线程分配
19.9.2可扩展并行收集
19.9.3并发收集
19.9.4大尺寸对象
19.10监视垃圾收集
第二十章 CLR寄宿、应用程序域、反射
20.1元数据:.NET框架的基石
20.2CLR寄宿
任何Windows应用程序都可以寄宿CLR。
20.3应用程序域
是一组程序集的一个逻辑容器。特点:
① 应用程序域之间是相互隔离的。
② 引用程序域可以被卸载。
③ 应用程序域可以单独实施安全策略和配置策略。
包括:ApplicationName,ApplicationBase,PrivateBinPath,ConfiguationFile,LoaderOptimization
20.3.1跨越应用程序域边界访问对象
20.3.2应用程序域事件
20.3.3应用程序及其如何寄宿CLR和管理应用程序域
20.3.4Yukon:Sql Server的下一个版本代号
20.4反射概要
20.5反射一个程序集中的类型
20.6反射一个应用程序域中的程序集
20.7反射一个类型的成员:绑定
20.8显式加载程序集
20.8.1将程序集象“数据文件”一样加载
20.8.2建立一个异常类型的层次结构
20.9显式卸载程序集:卸载应用程序域
20.10获取一个System.Type对象的引用
20.11反射一个类型的成员
20.11.1创建一个类型的实例
20.11.2调用一个类型的方法
20.11.3一次绑定、多次调用
20.12反射一个类型的接口
20.13反射的性能
避免使用反射来访问类型成员,访问速度较慢,动态的定位及构造类型请遵循:
① 让类型继承自一个编译时已经确定的基类型。
② 让类型实现一个编译时已经确定的接口类型。
让类型实现的方法的名称和圆形匹配一个编译时已经确定的委托类型。