第六章 类型(class)和成员基础
1. 概述
本章讲述如何在一个类型中定义不同种类的成员。
2. 名词解释
3. 主要内容
3.1 类型的各种成员
在一个类型中,可以定义0个或多个以下种类的成员:
① 常量:常量就是指出数据值恒定不变的一个符号。逻辑上讲,常量始终是静态成员。
② 字段:字段表示一个只读或可读/可写的数据值。强烈建议字段都声明为私有。
③ 实例构造器:是将新对象的实例字段初始化为良好初始状态的一种特殊方法。
④ 类型构造器:是将类型的静态字段初始化为良好初始状态的一种特殊方法。
⑤ 方法:方法是一个特殊的函数,作用是更改或查询一个类型或对象的状态。
⑥ 操作符重载:是一个方法,它定义了将一个特定的操作符作用于对象时,应该如何操作这个对象。
⑦ 转换操作符:是定义如何隐式或显式的将对象从一种类型转型为另一种类型的方法。
⑧ 属性:利用属性,可以使用一种简单的、字段风格的语法来设置或查询类型或对象的部分逻辑状态,同时保证状态不遭到破坏。
⑨ 事件:利用事件,类型/对象可以向静态/实例方法发送通知。
⑩ 类型:类型可定义嵌套于其中的其他类型。
3.2 类型的可见性
*友元程序集:使用 System.Runtime.CompilerServices中的InternalsVisibleTo的attribute来标明它认为是“友元”的其他程序集。
3.3 成员的可访问性
3.4 静态类
C#编译器对静态类进行了如下限制:
① 必须从基类System.Object派生。
② 不能实现任何接口。
③ 只能定义静态成员。
④ 不能作为字段、方法参数或局部变量使用。
3.5 分部类/结构/接口
partial关键字告诉C#编译器,一个类、结构或接口的定义源代码可能要分散到一个或者多个源代码文件中。这么做的原因是:
① 源代码控制。
② 在同一个文件中,将一个类或结构分解成不同的逻辑单元。
③ 代码拆分。
3.6 组件、多态和版本控制
C#提供了5个能影响组件版本控制的关键字,可将它们应用于类型以及/或者类型成员。
① abstract ② virtual ③ override ④ sealed ⑤ new
3.6.1 CLR如何调用虚方法、虚属性和虚事件
CLR提供了call和callvirt(不能调用静态方法)两个方法调用指令。
设计一个类型时,应尽量减少定义的虚方法的数量:
① 调用虚方法的速度比非虚方法慢。
② JIT编译器不能内嵌(inline)虚方法,这也影响性能。
③ 虚方法使组件的版本控制变得更脆弱。
④ 建议把一组多态方法中最复杂的一个弄成虚方法,其他重载方法弄成非虚方法。这样有利于版本的稳定性。
3.6.2 合理使用类型的可见性和成员的可访问性
优先使用密封类,好处如下:
① 版本控制
② 性能
③ 安全性和可预测性
定义类时建议遵循的一些原则:
① 定义类时,除非确定要将一个类作为基类使用,并允许派生类对它进行特化,否则总是显示指定为sealed。
② 在类的内部,毫不犹豫的将数据字段定义为private。
③ 在类的内部,总是将方法、属性和事件定义为private和非虚。
④ 不建议定义 公共嵌套类型。
3.6.3 对类型进行版本控制时的虚方法的处理
4. 总结
讲述了定义类以及其成员时的方法和注意事项,以及作者的一些建议(比如closed类型)。
后面的章节会详细介绍类及各个成员的IL表示。