版权归原作者所有,如有侵权,请联系我们

[科普中国]-通用型别系统

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

通用类型系统定义了运行期引擎如果使用程序中的数据类型,以及如何配置数据在存储器中的一种标准,依照此种标准所撰写的编程语言,都可以在同一个运行期引擎中使用,因此它是跨语言支持的重要部分,亦即匹配 CTS 规范的编程语言所撰写出的程序,都可以在 CLR 中使用。

简介CTS与CLI规格都是由微软所发展,已标准化为 ECMA 335 标准:“Common Language Infrastructure (CLI) Partitions I to VI.”,并且由 Microsoft 在 .NET Framework 中完全的实作。

CLR中的一切都围绕类型展开,因为IL是面向对象的高级机器语言.类型向应用程序和其他类型公开了功能.通过类型,用一种编程语言写的代码能与另一种编程语言写的代码沟通.由于类型是CLR的根本,所以MS制定了一个正式的规范来描述类型的定义和行为,这就是"通用类型系统"。1

通用类型(CTS)规范

CTS规范规定,一个类型可以包含零个或者多个成员.成员如下:

(1)、字段

作为对象状态一部分的数据变量.字段根据名称和类型来区分

(2)、方法

针对对象执行操作的函数,通常会改变对象状态,方法有一个名称、一个签名以及一个或多个修饰符。签名指定参数数量(及其顺序).参数类型:方法是否有返回值,如果有返回值,还要指定返回值类型.

(3)、属性

对于调用者,属性看起来像是字段.但对于类型的实现者,属性看起来像是一个方法(或者两个方法,get和set方法).属性允许在访问值之前校验输入参数和对象状态,以及/或者尽在必要时才计算某个值.属性还允许类型的用户采用简化的语法.最后,属性只允许创建只读或只写的"字段".

(4)、事件

时间在对象以及其他相关对象之间实现了通知机制。具体请参考C# 事件

3、成员修饰符

通用类型系统(CTS)指定了类型可见性规则以及类型成员的访问规则.如下:

(1)、public

如果将类型标记为public,那么任何程序集都能看见并访问该类型

(2)、assembly(在C#中使用internal修饰符)

只有在同一个程序集中的代码才能看见并访问该类型.

(3)、private

被private修饰的成员智能由同一个类型中的其他成员访问

(4)、family(在C#中使用protected修饰符)

成员可由派生类型访问,不管那些类型是否在同一程序集中

(5)、protected internal

成员只能由同一程序集中的任何类型来访问.

CTS 的功能创建一个可协助跨语言集成、类型安全与代码的高性能运行的框架规范。

提供可在许多编程语言中完全实现的面向对象模型。

定义编程语言必须遵行,以帮助在不同的编程语言中所实现的对象能够与其他编程语言交互的规则。

CTS 也定义了确保由不同编程语言所定义的数据类型能与其他编程语言交互的规则。

CTS 的类型CTS 定义了两种类型:

实值类型 (Value-type)

实值类型直接包含数据,而且实值类型的运行个体 (Instance) 不是在堆栈上配置,就是在结构中内嵌 (Inline) 配置。实值类型可为内置 (由运行阶段实现)、用户定义或枚举类型 (Enumeration)。

引用类型 (Reference-type)

存储变量存储器地址的引用,并且在堆积 (Heap) 上配置。引用类型可为自我描述类型、指针类型 (Pointer Type) 或接口类型 (Interface Type)。引用类型的类型可从自我描述类型的值判断出来。自我描述类型可再分为数组和类别类型。类别类型包括用户定义类型、Boxed 实值类型和委派。

Boxing 与 UnboxingBoxing所谓的打包 (Boxing),是指将实值类型转换成引用类型的一种机制,如下列代码所示,程序并不一定要明确的告知编译器要将实值类型转换成引用,它自己会处理这个部分。

Int32 x = 10; object o = x ; // 隐含打包Console.WriteLine("The Object o = {0}",o); // prints out 10然而,一个 Int32 变量总能够使用类似下列的方式来外显打包:

Int32 x = 10; object o = (object) x; // 外显打包(明确指定)Console.WriteLine("The object o = {0}",o); // prints out 10Unboxing所谓的解包 (Unboxing),是指将引用类型反转回实值类型,如下列程序所示。

Int32 x = 5; object o = x; // 隐含打包x = o; // 隐含解包本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学