CLR Via C# 3rd 阅读摘要 -- Chapter 6 - Type and Member Basics
The Different Kinds of Type
1. 类型成员的不同种类:
- 常量。逻辑上,常量总是静态成员;
- 字段。类型状态的一部分;
- 实例构造器;
- 类型构造器。也叫静态构造器...;
- 方法;
- 重载操作符。方法的一种,但是操作符重载方法不是CLS的一部分;
- 转换操作符。显式的和隐式的,也不是CLS的一部分;
- Properties ;
- 事件;
- 类型。嵌套类型。
2. 在代码中定义的所有成员,编译器都会生成相应的元数据。
Type Visibility
1. Type的可见性:public,internal(缺省的);
2. 友元程序集。System.Runtime.CompilerServices.InternalVisibleTo属性。友元程序集可以访问程序集中所有的internal类型的internal成员;
3. 友元程序集仅仅用于这些程序集以同样的计划装配甚至装配在一起。最好考虑在LinkDemand时以StrongNameIdentifyPermission来限制访问。
Member Accessibility
1. 不支持Family and Assembly。
2. C#的限制,基类和继承类中成员的访问性应该保持一致。如果一个成员在基类中是protected的,那么在继承类中该成员必须也是protected的。但CLR并不是这样限制的,CLR只允许继承类保持或提升成员的可访问性,而不能降低。也就是基类中如果成员是protected,那么继承类中可以是public,但不能是private。
Static Classes
1. 静态类static class的限制:
- 必须直接从System.Object继承,不能创建一个静态类的实例;
- 不实现任何接口,因为接口方法只能通过类的实例来调用;
- 静态类中只能定义静态成员;
- 静态类不能用作别的类型的字段、方法的参数、局部变量,因为这些变量将引用到一个实例, 这是不允许的。
2. 静态类中没有.ctor。
Partial Classes,Structures,and Interfaces
1. partial 部分类,结构,和接口,就是这些类型的定义放在不同的代码文件中;
2. 这样做的三个理由:
- 多人协同时的源文件控制;
- 区分不同的逻辑单元;
- 更好使用的代码片段。
Components, Polymorphism,and Versioning
1. 组件的一些特征:
- 组件是用来发布的;
- 组件有个标识;
- 组件永远管理它的标识;
- 组件清楚的指出了它依赖哪些东西(reference metadata tables);
- 组件记录了它的类和成员;
- 组件必须指出它需要的安全权限,CAS;
- 组件发布的接口(包括对象模型)不会被任何服务改变。
2. 版本号(major.minor.build.revision),但是CLR并不是通过major.minor来处理加载,而是major.minor.build.revision,除非做了重定向绑定;
3. C#的关键字以及它们如何影响组件的版本。
4. CLR提供两种IL指令来调用方法:
- call用于调用静态,实例,虚拟方法。call不假定this不是null,不做检查。call还经常用来以非虚拟的方式调用虚拟方法;
- callvirt用来调用实例方法,虚拟方法,不能调用静态方法。call需要检查this是否为null。callvirt效率比call要低很多。
5. 一些指南性规则:
- 尽量少定义虚拟方法;
- 尽量使用sealed类定义;
- 数据字段使用private;
- 格言:事情变的复杂起来的时候,定义更多的类。
6. 不能seal Finalize方法。
本章小结
本章讲了类型和成员的一些基本概念:类型成员的种类;类型和成员的可见性;静态类的特征;部分类型的用法和优点;CLR调用的两种方式;最后给出了定义类时的一些建议。