C# CTS类类型
一个给定的程序集可能包含任意数量的不同"类型"。在.NET领域里,类型(type)是一个一般性的术语,它指的是集合{类,接口,结构,枚举,委托}里的任意一个成员。当用支持.NET的语言构建解决方案时,很有可能要与这些类型打交道。例如,程序集可能定义了一个类,它又实现了一些接口。或许其中某个接口方法采用枚举类型作为输入参数,而在调用时返回一个结构。
CTS(公共类型系统)是一个正式的规范,它规定了类型必须如何定义才能被CLR承载。通常,只有那些创建针对.NET平台的工具或编译器的人才对CTS的内部工作非常关心。但是,对于所有.NET编程人员来说,学习如何在自己使用的语言中使用由CTS定义的5种类型,是非常重要的。这里简单概括一下。
1 CTS类类型
每一种支持.NET的语言至少要支持类类型(class type)的概念,这是面向对象编程(OOP)的基础。类可能由很多成员(诸如属性、方法和事件)和数据(字段)组成。在C#中,使用class关键字来声明类:
// C#类类型。class Calc{ public int Add(int x, int y) { return x + y; }}
表1-1 CTS类类型
|
类的特征 |
在生命周期里的意义 |
||
|
类是否被“密封” |
密封类不能作为其他类的基类 |
||
|
类实现任何接口了吗 |
接口是抽象成员的集合,它在对象和对象的用 户间提供一个契约。CTS允许类或结构实现任 何数目的接口 |
||
|
类是具体的还是抽象的 |
抽象类是不能直接创建的,但是可以用来为派 生类型定义公共的行为。具体类可以直接创建 |
||
|
这个类的可见性是什么
|
每个类必须设置可见性。基本上,可见性定义了 该类是被外部程序集使用,还是仅能在定义了它 的程序集中使用 |
2 CTS接口类型
接口(interface)就是由抽象成员定义所组成的一个具名集合,可通过一个给定的类或结构来支持(即实现)。与COM不同,.NET接口并不派生公共的基接口(如IUnknown)。在C#中,接口类型使用interface关键字来定义,例如:
// C#接口通常被声明为公共的,这样其他程序集中的类型就可以实现其行为。
public interface IDraw
{
void Draw();
}
就它们自身而言,接口没有什么用。然而,当一个类或结构用其独特方式来实现一个给定接口时,你将能够以多态方式通过接口引用来请求使用所提供的功能.
3 CTS结构类型
CTS中还支持结构(structure)的概念。如果你有C语言的背景,应该会很高兴地发现这种用户自定义类型(UDT)也存在于.NET领域中(虽然它们的行为在底层不同)。简单地说,结构(struct)可以看作是具有值语义的轻量级类类型。通常,结构最适合建模几何和数学数据,在C#中使用struct关键字创建:
// C#结构类型。
struct Point
{
// 结构可以包含字段。
public int xPos, yPos;
// 结构可以包含参数化构造函数。
public Point(int x, int y)
{ xPos = x; yPos = y;}
// 结构可以定义方法。
public void Display()
{
Console.WriteLine("({0}, {1})", xPos, yPos);
}
}
|
4 CTS枚举类型
枚举(enumeration)是一种便利的编程结构,它可以用来组成名称/值对。例如,假设你在开发一个视频游戏的程序,要让玩家在3种角色(Wizard、Fighter或Thief)中选择一个。你完全可以用enum关键字来建立一个自定义的枚举,而不用老是要记着代表每种可能性的原始数字值:
// C#枚举类型。
enum CharacterType
{
Wizard = 100,
Fighter = 200,
Thief = 300
}
|
在默认情况下,每一项是用一个32位的整数来存储的,但如果需要,也可以改变存储大小(例如,在为Pocket PC之类的低内存设备编程时)。另外,CTS要求枚举类型派生自基类System.Enum。在第3章中你将看到,这个基类定义了一些有趣的成员,允许通过编程提取、操作和变换底层的名称/值对。
5 CTS委托类型
委托(delegate)在.NET中等效于类型安全的C风格的函数指针。它们的主要不同之处在于,.NET委托是派生自System.MulticastDelegate的类,而不是一个简单地指向原始内存地址的指针。在C#中,委托是使用关键字delegate来声明的:
// 这个C#委托类型可以"指向"任意带有两个整型参数且返回一个整型值的方法。 delegate int BinaryOp(int x, int y); |
一个实体可以用委托向另一个实体传递调用,另外,委托也为.NET事件架构提供了基础。在第11章和第18章中你将看到,委托对多路广播(即,将一个请求转发给多个接收者)和异步方法调用有着内在支持。

浙公网安备 33010602011771号