[非技术参考]C#枚举类型

(一)首先讲一个不熟悉的数据类型:byte

byte 关键字代表一种整型,该类型按下表所示存储值:

类型

范围

大小

.NET Framework 类型

byte

0 到 255

无符号 8 位整数

System.Byte

可如下例所示声明并初始化 byte 类型的变量:

byte myByte = 255;

在以上声明中,整数(不是整型) 255 从 int 隐式转换为 byte。 如果整数超出了 byte 的范围,将产生编译错误。

存在从 byte 到 short、ushort、int、uint、long、ulong、float、double 或 decimal 的预定义隐式转换。

不能将更大存储大小的非文本数值类型隐式转换为 byte。但是,在目标变量具有相同或更大的存储大小时,使用下列语句是可能的。

byte x = 10, y = 20;//将整型数值赋值byte类型变量

// Error: conversion from int to byte:
//以下赋值语句将产生一个编译错误,原因是赋值运算符右侧的算术表达式在默认情况下的计算结果为 int 类型。
byte z = x + y;
// OK: explicit conversion:
byte z = (byte)(x + y);

//在目标变量具有相同或更大的存储大小时,使用下列语句是可能的:
int x = 10, y = 20;
int m = x + y;
long n = x + y;

(二)枚举类型

enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型

每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。 枚举元素的默认基础类型为 int。 要声明另一整型枚举(如 byte),请在标识符之后紧跟类型,然后再使用冒号,如下面的示例所示。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

准许使用的枚举类型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。

可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。

Days是一个类型,它可以定义变量,并且给变量赋值。

基础类型指定为每个枚举数分配的存储大小。 但是,从 enum 类型到整型的转换需要用显式类型转换来完成。 例如,下面的语句使用强制转换(从 enum 转换为 int)将枚举数 Sun 赋值给一个 int 类型的变量。

int x = (int)Days.Sun;

将 System.FlagsAttribute 应用于某个枚举时,如果该枚举包含一些使用按位 OR 运算组合的元素,该特性在用于某些工具时会影响 enum 的行为。 当使用诸如 Console 类方法、表达式计算器这样的工具时,可以注意到这些变化。

public class EnumTest 
    {
        enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat};

        static void Main()
        {
            int x = (int)Days.Sun;
            int y = (int)Days.Fri;

            Days day = (Days)100;
            Days dd = (Days)3;

            Console.WriteLine("Sun = {0}", x);//输出Sun = 0
            Console.WriteLine("Sun = {0}", Days.Sun);//输出 Sun = Sun
            Console.WriteLine("Fri = {0}", y);//输出 Fri = 5
            Console.WriteLine("day = {0}", day);//输出day = 100
            Console.WriteLine("day = {0}", dd);//输出dd = Wed

            Console.ReadKey();
        }
    }

System.FlagsAttribute 应用于某个枚举代码:

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays
        // the name of each enum element that corresponds to a flag that has
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/
如果您移除 Flags,则示例将显示以下值:
5
5

可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。 (当然,某些组合在您的程序代码中可能没有意义或不允许使用。)

创建位标志枚举的方法是应用 System.FlagsAttribute 特性并适当定义一些值,以便可以对这些值执行 AND、OR、NOT 和 XOR 按位运算。 在位标志枚举中包含一个值为零(表示“未设置任何标志”)的命名常量。如果零值不表示“未设置任何标志”,则请不要为标志指定零值。

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

http://msdn.microsoft.com/zh-cn/library/cc138362.aspx

http://msdn.microsoft.com/zh-cn/library/system.flagsattribute.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

posted @ 2014-12-11 18:33  stemon  阅读(394)  评论(0编辑  收藏  举报