C# 教程 在线

2396C# 枚举(Enum)

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。但你也可以設定每個符號的值,如果字符 n 你沒有設定值,他的值就是字符 (n-1)+1,舉個例子:比如枚舉字符 g,他的值就是字符 f 的值 +1,但由於 f 的值不知道,他就會去找第(n-1)的值,也就是 e 的值,以此類推,找到了 c 的值 1,e=c+1=2,f=e+1=3,g=f+1=4;

using System;

class Program
{
    enum Day  {a=8,b,c=1,e,f,g};
    static void Main(string[] args)
    {
            int a = (int)Day.a;//8
            int x = (int)Day.b;//9
            int c = (int)Day.c;//1
            int b = (int)Day.e;//2
            int g = (int)Day.g;//4
    }
}

默认情况下,第一个枚举符号的值是 0。

using System;

class Program
{
    enum Day  { a, b, c, e = 1, f, g };
    static void Main(string[] args)
    {
            int a = (int)Day.a;//0
            int x = (int)Day.b;//1
            int c = (int)Day.c;//2
            int b = (int)Day.e;//1
            int g = (int)Day.g;//3
    }
}

2395C# 枚举(Enum)

Enum Gender
{
    Male = 1,
  , Female = 0
}

Gender gender = Gender.Male;

// Enum => int
int genderId = (int)gender; // 1

// int => Enum
Gender gender1 = (Gender)0; // Female,超出枚举数值范围返回数值本身

// Enum => string
string genderStr = gender.ToString(); // Male

// string => Enum
Gender gender2 = (Gender)Enum.Parse(typeof(Gender), "Female"); // Gender.Female,超出字符串范围报错

2394C# 枚举(Enum)

位标志枚举(flags enumeration)

现实中不总是用离散值枚举,以一周中的7天为例,假设要求应用程序用户指定一周中各天的任意组合,便可以使用"位标志枚举"。使用位标志枚举时,可以用或运算创建新的组合值。以星期为例,声明方法如下:

[Flags]
public enum Days
{
    None = 0,
    Sunday = 0x01,          //0000 0001
    Monday = 0x02,          //0000 0010
    Tuesday = 0x04,         //0000 0100
    Wednesday = 0x08,       //0000 1000
    Thursday = 0x10,        //0001 0000
    Friday = 0x20,          //0010 0000
    Saturday = 0x40,        //0100 0000
    Weekend = Sunday | Saturday,     //0100 0001
    Workdays = Monday | Tuesday | Wednesday | Tuesday | Friday, //0011 1110
}

为了让位标志枚举的值能够组合,所有值都必须是2的幂。因为组合多个值时,必须能确定结果为哪个离散值。

在简单枚举中,可以让名称None或最常用默认名称对应于0,但标志枚举要求0对应于名称None,这个值意味着所有标志都未设置。

执行:

Days days = Days.Weekend;
Console.WriteLine("{0} : {1}",days,(int)days);

结果输出:

Weekend : 65

2393C# 枚举(Enum)

枚举体在给数组中具体标号位置给予含义是使用,可以使程序更容易读懂和修改。

enum len  { Length, width, height};

static void Main(string[] args)
{
    int[] parameter = new int[3] {1,5,8};
    Console.WriteLine("Length: {0}", parameter[(int)len.Length]);
    Console.WriteLine("width: {0}", parameter[(int)len.width]);
    Console.WriteLine("height: {0}", parameter[(int)len.height]);
}

此时可以一眼看出打印值为参数的长宽高。

相对于使用

#define length 0
#define width  1
#define height 2

该方式在插入一个参时更方便:

#define area   0
#define length 1
#define width  2
#define height 3

enum len  {area, Length, width, height};

很明显使用Enum方式更容易更改。

2392C# 枚举(Enum)

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。第 n 个符号值与第 n-1 个有关。

using System;

class Program
{
    enum Day  {a=8,b,c=1,e,f,g};
    static void Main(string[] args)
    {
        int a = (int)Day.a;
        int b = (int)Day.e;
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.ReadKey();
    }
}

结果:

8
2