这两天读了第12章和第13章,内容包括反射、错误与异常。
反射是一个很重要的知识点,使用它可以完成一些很强大、很复杂的功能。如枚举类型的成员,实例化新对象,执行对象的成员,查找类型的信息,查找程序集的信息,检查应用于类型的定制特性,创建和编译新程序集等。
由于反射涉及到知识点很多,所以书中之介绍了其中的部分功能:查找类型的信息和检查应用于类型的定制特性。
什么是特性?
.NET中可以派生类System.Attribute来定义自己的特性。在定义特性的类中,需要使用AttributeUsage特性的一些属性来控制自定义的特性用法的信息。
AttributeUsage的第一个参数是枚举类型AttributeTargets,它是必须的,它指定特性可以应用到哪些程序元素上(比如AttributeTargets.Class指定特性应用到类上)。另两个参数是AllowMultiple和Inherited,AllowMultiple指定特性是否可以多次应用在同一个程序元素上(比如AllowMultiple = true表示可以),而Inherited指定特性在应用到类或接口上时,是否由派生类和接口继承,如果应用到方法或属性上时,也可以自动应用到该方法或属性的重载上。
什么是类型?
Type类实际是一个抽象的基类,只要实例化了一个Type对象,就实例化了Type的一个派生类。
获取给定类型的Type引用有3种常用方式:使用C#的typeof运算符(如Type t = typeof(double);),使用GetType()方法(如double d = 10,Type t = d.GetType();),使用Type的static方法GetType()(如Type t = Type.GetTypes("System.Double");
Type有很多属性,但是都是只读的(如Name,FullName,IsClass等),还有很多成对的方法(如GetConstructor(),GetConstructors()等)。
什么是程序集?
Assembly类是在System.Reflection命名空间中定义的,它允许访问给定程序集的元数据,也包含可以加载和执行程序集的方法。
错误与异常是程序中不可能避免的,很多人认为程序的大部分工作就是寻找它们并试图处理它们。
在C#中,所有的异常派生于类Execption,而自定义的异常派生于ApplicationException。
使用try{.......}catch{.....}finally{......}来捕获异常,处理代码在try块中,如果发生异常将跳出try块,异常将与catch中列举的异常进行匹配,如果能过匹配将执行catch中的代码。不管怎么样,finally块中的代码都会执行,finally块不是必须的。异常块可以嵌套。
catch和finally块中也可能出现异常。