《CLR via C#》设计类型.类型和成员基础、常量和字段

6.类型和成员基础

6.1类型的常见成员

常量:总与类型关联,不与类型的实例关联,类似static成员。
字段:可以是静态的,那就是类型状态的一部分;也可以是实例的(非静态的),那就是对象状态的一部分。
实例构造器:初始化对象的实例字段。在元数据中是.ctor。
类型构造器:初始化类型的静态字段。也就是常说的静态构造函数。在元数据中是.cctor。
方法:更改或查询状态的函数。静态方法作用于类型;实例方法作用于对象。
属性:有静态属性和实例属性。无参属性叫做属性,有参属性叫做索引器(相当少见)。
事件:静态事件允许类型向一或多个方法发送通知;实例事件允许对象向一或多个方法发送通知。
类型:类型中可定义嵌套类型,常用于将复杂的类型分解为更小的构建单元以简化实现。

6.2类型的可见性

定义类型时不显示指定可见性的话,C#编译器会帮你指定为internal,也就是该类只在同一个程序集中可见。
假设某个类想指定为internal,但又想被特定的程序集访问,这就需要用友元程序集。

6.3成员的可访问性

成员可访问性从限制最大到最小排序:private、protected、internal、protected internal(protected和internal访问性的叠加)、public。如果没有显示指定成员的可访问性,通常是默认为private。

CLR要求接口类型的所有成员的可访问性必须是public,所以,C#编译器禁止开发人员显示指定接口成员的可访问性。但接口类型是可以显示指定可访问性的。另外,接口中不能有字段,接口中的方法只能被声明。

由于CLR承诺子类可以转型为基类,所以,不能在子类中收紧对基类成员的访问,但可放宽。

6.4静态类

静态类里只有静态成员,静态类不能被实例化。
static只能用于类,不能用于结构(值类型),因为值类型都能被实例化。
静态(static)类在元数据中是抽象封装类,也就是被C#编译器定义为abstract和sealed,sealed意味着该类不能被继承。

6.5合理使用类型的可见性和成员的可访问性

建议:1.定义类时,除非确定要将其作为基类,否则总是显示地指定为sealed;2.字段尽量都指定为private;3.方法、属性和事件尽量都指定为private且非虚。

另外,OOP有一条格言:当事情变得过于复杂时,就搞更多的类型出来,也就是定义一些辅助类型来封装独立的功能。辅助类型和“超类型”放在不同的脚本也好,放同一个脚本也好,甚至当此辅助类型只属于一个超类型时,嵌套也行。

7.常量和字段

7.1常量

用const修饰:public const int MaxInt16 = 32767;
常量的值必须在编译时确定。C#不允许指定常量为static,因为常量总是隐式为static,常量被视为静态成员。

7.2字段

字段是一个值类型的实例或者一个引用类型的引用。有类型(静态)字段和实例(非静态)字段。
字段修饰符主要有static、readonly和(默认),(默认)就是该字段与类型的一个对象关联,而static就是该字段和类型的类型关联,readonly表明该字段只能由一个构造器方法写入。
static readonly经常一起修饰一个字段,也就是该只读字段属于类型,可通过“类名.字段名”来调用,而不是通过“对象名.字段名”来调用。

猜你喜欢

转载自blog.csdn.net/BillCYJ/article/details/90552939