定义新的值类型有两种方式:一种方式是定义以System.ValueType为基类型的类型:另一种方式是定义以System.Enum为基类型的类型。C#的struct定义与class定义极为相似,只是关键字不同而已。但还是有一些差别:你不能给c#的struct指定显式的基类型,即隐含的基类型总是System.ValueType。你也不能显式地将c#的struct声明为abstract或者sealed,更确切地说,编译器将隐式地添加sealed修饰符。考虑下面简单的C# struct定义:
Public struce Size
{
Public int height;
Public int width;
Public void Scale(double factor){
Height *= factor;
Width *=factor;
}
Public int Area{get{return height*width;}}
}
注意,像C# class的定义一样,C# struct可以有方法和宇段,struct还能支持任何
接口。说到底,C# struct的定义等价于定义了一个派生于System.ValueType的新的C# class:例如,前面的struct等价于下面的类定义:
Public sealed class Size:System.ValueType{
Public int height;
Public int width;
Public void Scale(double factor){
Height*=factor;
Width*=factor;
}
Public int Area{ get { return height * width; } }
}
然而,c#编译器不允许ValueType用作基类型。更确切地说,你必须使用struct构件才能实现这个目的。
对于充当用户自定义的基本数据类型,却又包含任意合成字段的类型定义.c#的struct是很有用的。此外,你还可以定义特殊的整型,它不能添加任何新的字段,而是限制特定整型的值空间。这些受限制的整型被称为枚举类型(enumeration type)。
枚举类型是直接基类型为System.Enum而不是System.ValueType的CLR值类型。枚举类型必须指定一个辅助类型用于枚举能数据表示。这个辅助类型必须是CLR内置整型之一(不包括System.Char)。枚举类型可以包含成员;然而,被支持的成员只是字面字段。枚举类型的字面字段必须匹配枚举的基础表示类型,并且充当能被用于枚举实例的合法值的集合。
你可以使用c#的enum定义创建枚举类型。C#的enum与C或C++的enum很相似。c#的enum定义包含一个用逗号分隔的惟一名字的列表:
Public enum Breath
{
None,Sweet,Garlicky,Oniony,
Rencid,Horrid,Sewerlike
}
编译器为每个名字赋予一个数值。如果没有提供显式值(在这个示例中就是如此),那么,编译器将按声明顺序予0、1、2等等。在概念上,这个enum等价于下面的c#类定义:
public sealed class Breatn:System.Enum {
public const int None=0;
public const int Sweet=1;
public const int Garlicky=2;
public const int Oniony=3;
public const int Rancid=4;
public const int Horrid=5;
public const int Sewerlike=6;
}
然而,如同valueType一样,C#编译器禁止显式地将System.Enum作为基类型,只能够采用enum构件。此外,不同于C,c#并不认为数值类型与枚举类型是兼容的,如果要像处理int一样处理enum(反之亦然),则必须首先显式地将其强制转换为想要的类型。相反,c++允许从枚举类型到数值类型的隐式转换。