第二部分 设计类型:第6章 类型和成员基础
6.1类型的各种成员
在一个类型中,可以定义0个或多个以下种类成员:
•实例构造器:将新对象的实例字段初始化的一种特殊方法。
•常量:数据值恒定不变的符号,使代码更容易阅读和维护。常量通常与类型关联,不与类型的实例关联。逻辑上讲,常量是静态成员。
•字段:表示可读或可读/可写的数据值。字段是静态时被认为是类型状态的一部分。字段是非静态时被认为是对象状态的一部分。强烈建议将字段声明为私有字段,防止类型或对象的状态被外部代码破坏。
•属性:实质是方法,以一种简单的字段风格的语法来设置或查询类型或对象的部分逻辑状态,并保证状态不被破坏。作用于类型的称为静态属性,作用于对象的称为实例属性。属性可以没有参数(普遍),也可以有多个参数(仅对集合类来说常见)。
•方法:是一个特殊函数,用于更改或查询一个类型或对象的状态。作用于类型时称为静态方法,作用于对象时称为实例方法。方法一般对类型或对象的字段执行读写操作。
•事件:利用静态事件,一个类型可以向一个或多个静态或实例方法发送通知。利用实例事件(非静态),一个对象可以向一个或多个静态或实例方法发送通知。
提供事件的类型或对象的状态发生改变,通常就会引发事件。
事件包含两个方法,允许静态或实例方法登记或注销对该事件的关注。另外,事件还使用委托字段来维护已登记的方法集。
•操作符重载:实际是一个方法,定义了将一个特定操作符作用于对象时,应该如何操作该对象。不是所有语言都支持操作符重载,所以操作符重载方法不是“公共语言规范(CLS,Common Language Specification)”的一部分。
•转换操作符:定义如何隐式或显式地将对象从一个类型转换为另一种类型的方法。和操作符重载情况一样,也不是CLS的一部分。
•类型:类型可定义嵌套于其中的其他类型。通常用这个办法将一个大的、复杂的类型分解成更小的构建单元,以简化实现。
无论什么语言元数据的格式是完全一致的,元数据是整个.Net FrameWork开发平台的关键,它实现了编程语言、类型和对象的无缝集成。
源代码中定义的任何成员都会被编译生成一些元数据。
6.2 类型的可见性
public类型对所有代码可见。
internal类型仅对定义程序集的代码可见。(默认)
友元程序集
当想让自己的internal程序集被指定的朋友团队的程序集访问到,可以用友元程序集。
6.3 成员的可访问性
CLR要求接口类型的所有成员都具有public可访问性,所以禁止开发人员显示指定接口成员的可访问性,编译器会自动将所有成员的可访问性设为public。
派生类重写基类中的成员时,要求可访问性保持一致,这是C#规定的。CLR规定派生类重新时可以放宽可访问性,比如原来基类成员为protected的,可以放宽到public。但不允许收紧。
6.4 静态类
静态类作用:将一组相关成员组合到一起。比如Math类定义了一组只执行数学运算的方法。
static只能应用于类,不能应用于结构(值类型),因为CLR总是允许值类型实例化。
C#编译器对静态类进行了如下限制:
•静态类必须直接从基类System.Object派生,从其他任何基类派生都没意义,因为不能创建静态类的实例。继承只适用于对象。
•静态类不能实现任何接口,这是因为只有使用类的实例时,才可以调用类的接口方法。
•静态类只能定义静态成员(字段、方法、属性和事件),任何实例成员都将导致编译器报错。
•静态类不能作为字段、方法参数或局部变量使用,因为他们都代表引用了一个实例的变量,而这是不允许的。编译器检测到任何这样的用法都会报错。
6.5 分步类、结构和接口
partial关键字告诉C#编译器,一个类、结构、接口的定义源码可能要分散到一个或多个文件中。
用partial分散的原因:
1.源代码控制。可以分拆成多个文件被签出修改,方便同时开发。
2.在同一个文件中,将一个类或结构分解成不同的逻辑单元。所有功能全部大杂烩般的放一起不方便分类管理,使用分步类可以很好的进行划分和管理。
3.代码拆分。新建winform窗体或Web窗体时,VS自动拆分创建两个文件,一个用来编码,一个是设计器的代码,可以防止不小心修改了设计器代码,分类明确。
partial关键字要应用于所有文件中的类型。编译器编译时会把代码合并,最后在.exe或.dll(或者.netmodule模块文件)中生成一个类型。
6.6组件、多态和版本控制 待续...
6.6.1 CLR如何调用虚方法、属性和事件
6.6.2合理使用类型的可见性和成员的可访问性
6.6.3对类型进行版本控制时的虚方法的处理