CLR via C# 3 读书笔记(7):第1章 CLR执行模型 — 1.7 通用类型系统

类型是CLR的基本,微软创建了一个正式的规约——通用类型系统(Common Type System,CTS)来描述类型的定义和行为。

CTS规约规定,类型可以包含0个或多个成员。

  • 字段(Field):属于对象状态部分的数据成员。字段由字段的名称和类型来标识。
  • 方法(Method):在对象上执行某种操作的函数,通常会改变对象的状态。方法包含名称、签名和修饰符。签名指定了方法参数的个数(和顺序)、参数的类型以及返回值类型。
  • 属性(Property):对调用者来说,属性类似字段。但对类型实现者来说,属性更像一个方法(或两个)。属性允许实现者在访问属性值之前验证输入参数,抑或在必要时进行求值计算。还可以创建只读或只写的“字段”。
  • 事件(Event):事件在一个对象和另一个与之相关联的对象之间建立一个通知机制。

CTS还指定了类型可见性和访问类型成员的一些规则。CTS建立了以程序集作为类型可见性边界的规则,CLR遵循了这些可见性规则。

  • Private:该成员只能被同一个类型的其他成员访问。
  • Family:该成员可以被派生类型访问,不管派生类型是否与父类位于同一个程序集。许多语言(C++、C#)都使用protected。
  • Family and assembly:该成员只能被同一程序集中的派生类访问。许多语言(C#、VB)都没有提供这种访问控制。当然,IL可以做到。
  • Assembly:该成员可以被同一程序集中的任何代码访问,许多语言使用internal。
  • Family or assembly:该成员可以被任何程序集中的派生类访问,也可以被同一程序集中的任何类型访问。C#使用protected internal。
  • Public:该成员可以被任何程序集中的任何代码访问。

此外,CTS还定义了管理类型继承、虚拟方法、对象生命周期的规则。设计这些规则的目的是使它们的语义可以用现代编程语言方便地表达出来。

在作者第一次使用CLR的时候,很快就意识到最好将语言和代码的行为区分开来。我们可以使用C++、C#和VB来创建相同的类型和成员,它们的语法不同,但是类型的行为是完全相同的。CLR的CTS定义了类型的行为

例如,CTS规定一个类型只能有一个父类。而C++支持多继承,但CTS不会接受这种类型。对此,当试图创建继承多个基类的类型时(托管代码),C++/CLI编译器会报错。

CTS还有一个规则,所有的类型必须(最终)继承自一个预定义的类型:System.Object。(可以使用/noautoinherit禁用这种默认的继承)该类定义在System命名空间下。System.Object允许执行以下操作:

  • 判断两个实例是否相等。
  • 获得实例的散列码。
  • 查询实例的类型。
  • 执行实例的浅拷贝(shallow copy),即按位(bitwise)拷贝。
  • 获得实例当前状态的字符串表示。
posted @ 2010-03-08 17:03  麒麟.NET  阅读(1862)  评论(1编辑  收藏  举报