enum 语句
更新:2007 年 11 月
声明枚举数据类型的名称和枚举成员的名称。
[modifiers] enum enumName [ : typeAnnotation]{
enumValue1 [ = initializer1]
[,enumValue2 [ = initializer2]
[, ... [,enumValueN [ = initializerN ] ]]]
}
参数
modifiers
可选。控制枚举的可见性和行为的修饰符。enumName
必需。枚举类型的名称。typeAnnotation
可选。枚举的基础数据类型。必须为整型数据类型。默认值为 int。enumValue1, enumValue2, ..., enumValueN
可选。枚举类型成员。initializer1, initializer2, ..., initializerN
可选。重写枚举成员的默认数值的常数表达式。
备注
enum 声明在程序中引入新的枚举数据类型。enum 声明只能出现在类声明可以出现的上下文中(即全局范围)、包范围内或类范围内,而不能出现在函数或方法中。
可以将枚举的基础类型声明为任何整型数据类型(int、short、long、byte、uint、ushort、ulong 或 sbyte)。枚举成员隐式地强迫到/自基础数据类型,从而允许将数值数据直接赋给类型为 enum 的变量。默认情况下,枚举的基础数据类型为 int。
每个枚举类型成员都有一个名称和一个可选的初始值设定项。初始值设定项必须是与指定枚举具有相同类型(或可转换为该类型)的编译时常数表达式。第一个枚举类型成员的值为零或初始值设定项的值(如果已提供)。后继的每个枚举类型成员的值比前一个成员大一或者是初始值设定项的值(如果已提供)。
enum 值以类似于访问静态类成员的方法来进行访问。成员的名称必须用枚举的名称(例如 Color.Red)来进行限定。当给 enum 类型的变量赋值时,可以使用以下三项中的一项:完全限定名(例如 Color.Red)、名称的字符串表示形式(例如 "Red")或数值。
如果给 enum 赋以在编译时已知的字符串,编译器将执行必要的转换。例如,"Red" 会替换为 Color.Red。如果字符串在编译时未知,则将在运行时执行转换。如果字符串不是枚举类型的有效成员,该转换则可能失败。由于转换需要时间并且可能生成运行时错误,所以应避免将 enum 赋给变量字符串。
枚举类型的变量可以接受声明值范围之外的值。此功能的用途之一是允许将成员组合用作位标志,如以下示例所示。将 enum 变量转换为字符串会产生成员名称的字符串表示形式。
示例 1
下面的示例显示枚举的行为。它声明一个名为 CarType 的简单枚举,该枚举的成员包括 Honda、Toyota 和 Nissan。
enum CarType {
Honda, // Value of zero, since it is first.
Toyota, // Value of 1, the successor of zero.
Nissan // Value of 2.
}
// Declare a variable of type CarType, and give it the value Honda.
var myCar : CarType = CarType.Honda;
print(int(myCar) + ": " + myCar);
myCar = "Nissan"; // Change the value to "Nissan".
print(int(myCar) + ": " + myCar);
myCar = 1; // 1 is the value of the Toyota member.
print(int(myCar) + ": " + myCar);
该代码的输出为:
0: Honda
2: Nissan
1: Toyota
示例 2
下面的示例显示如何使用枚举来接受位标志,并显示 enum 变量必须能够接受不显式存在于成员列表中的值。它定义一个枚举 FormatFlags,该 FormatFlags 用于修改 Format 函数的行为。
// Explicitly set the type to byte, as there are only a few flags.
enum FormatFlags : byte {
// Can't use the default values, since we need explicit bits
ToUpperCase = 1, // Should not combine ToUpper and ToLower.
ToLowerCase = 2,
TrimLeft = 4, // Trim leading spaces.
TrimRight = 8, // Trim trailing spaces.
UriEncode = 16 // Encode string as a URI.
}
function Format(s : String, flags : FormatFlags) : String {
var ret : String = s;
if(flags & FormatFlags.ToUpperCase) ret = ret.toUpperCase();
if(flags & FormatFlags.ToLowerCase) ret = ret.toLowerCase();
if(flags & FormatFlags.TrimLeft) ret = ret.replace(/^\s+/g, "");
if(flags & FormatFlags.TrimRight) ret = ret.replace(/\s+$/g, "");
if(flags & FormatFlags.UriEncode) ret = encodeURI(ret);
return ret;
}
// Combine two enumeration values and store in a FormatFlags variable.
var trim : FormatFlags = FormatFlags.TrimLeft | FormatFlags.TrimRight;
// Combine two enumeration values and store in a byte variable.
var lowerURI : byte = FormatFlags.UriEncode | FormatFlags.ToLowerCase;
var str : String = " hello, WORLD ";
print(trim + ": " + Format(str, trim));
print(FormatFlags.ToUpperCase + ": " + Format(str, FormatFlags.ToUpperCase));
print(lowerURI + ": " + Format(str, lowerURI));
该代码的输出为:
12: hello, WORLD
ToUpperCase: HELLO, WORLD
18: %20%20hello,%20world%20%20