小白终于懂了!!!C# 枚举Enum你会了吗?

C# 枚举(Enum)
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。

C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。

声明 enum 变量
声明枚举的一般语法:

enum
{
enumeration list
};
其中,

enum_name 指定枚举的类型名称。
enumeration list 是一个用逗号分隔的标识符列表。
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
实例
下面的实例演示了枚举变量的用法:

实例

using System;

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

    static void Main()
    {
        int x = (int)Day.Sun;
        int y = (int)Day.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

Sun = 0
Fri = 5
C# 结构体(Struct) C# 类(Class)
10 篇学员笔记 :

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

但是,你也可以自定义每个符号的值:

using System;
namespace EnumApplication
{
    class EnumProgram
    {
        enum Days {
            Mon=71, 
            tue=61, 
            Wed=51, 
            thu=41, 
            Fri=51, 
            Sat=61, 
            Sun=71
        };

        static void Main(string[] args)
        {
            int WeekdayStart = (int)Days.Mon;
            int WeekdayEnd = (int)Days.Fri;
            Console.WriteLine("Monday: {0}", WeekdayStart);
            Console.WriteLine("Friday: {0}", WeekdayEnd);
            Console.ReadKey();
        }
    }
}

输出结果:

Monday: 71
Friday: 51
Tommy Peng
   Tommy Peng

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 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

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

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方式更容易更改。

位标志枚举(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
//
//

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,超出字符串范围报错

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 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
    }
}

枚举中的每一个数字都是整数型,如果不给任何一个元素赋值的话,那么是默认从 0 开始以 1 为单位的增长,如果全部赋值,那么也不用说上面分享笔记的同学已经说过了这种情况,我想说一说在列举元素内部元素赋值的情况(非首尾的元素),以列举元素第N位,我们赋值为 a,那么运行结果是 Mon=1、Fri=22,所以由此可知,在赋值的元素之前,仍然服从默认赋值规律,从 0 开始以 1 为 increment 的增长知道第 N-1 位,但是从赋值的 N 位开始,以其值 a 为起点的 increment 为 1 的增长,即:a+1,a+2,a+3…

using System;
public class EnumTest
{
    enum Day {  Sun, Mon, Tue=19, Wed, Thu, Fri, Sat };  /*列举其中的元素*/
    static void Main()
    {
        int x = (int)Day.Mon;
        int y = (int)Day.Fri;
        Console.WriteLine("Mon = {0}", x);   /*一般数组中默认的数值第一个就是0,其后是一次增大的,但是也是可以对数组中的每个元素进行赋值*/
        Console.WriteLine("Fri = {0}", y);
        Console.ReadKey();
    }
}

同上面那位我点赞的同学一样说下位枚举的一个实例;

//1、给用户创建、读取,修改和删除的权限
var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete;

//2、去掉用户的修改和删除权限
parmission = parmission &~parmission.Update;
parmission = parmission &~parmission.Delete;

//3、给用户加上修改的权限
parmission = parmission | parmission.Update;

//4、判断用户是否有创建的权限
var isCreate = (parmission & parmission.Create)!=0;
//或者
var isCreate = (parmission & parmission.Create)==parmission.Create;
  这时parmission枚举的值将变成0+1+4=5,它的ToSting()将变成“parmission.Create,
  parmission.Read”,parmission.Update; 这里我们可以解释为什么第五个值Delete是8而不能成为5。
  也就是说它的值不应该是前几项值的复合值。一个比较简单的方法
  就是用2的n次方来依次位每一项赋值,例如:1,2,4,8,16,32,64…。
maanshancss
maanshancss

枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

说明: 枚举其实就是特殊的常量类,且构造方法被默认强制是私有。

正例: 枚举名字: DealStatusEnum, 成员名称: SUCCESS / UNKOWN_REASON

枚举是一种类型
适用于某些取值范围有限的数据,例如:我只想要春夏秋冬这四个字符的取值范围,如果用string的话就无法固定取值范围
枚举语法:[访问权限修饰符] enum 枚举名 { 枚举值 }
枚举访问权限修饰符和类是一样的,默认访问权限和类一样都是internal
枚举名遵循大驼峰命名法
枚举的每一个值都是一个整型,默认都是从 0 开始
以上特点上面笔记都差不多都说,然后还有两点:

1、枚举中的元素的值可以设置为相同,但不推荐。
2、枚举元素默认的值的类型是 int 型,可以修改为其他整型 byte、sbyte、short、ushort、int、uint、long 和 ulong。

public enum Season_1
{
    spring_1 = 3,  //3
    sunmmer_1,     //4
    autumn_1 = 3,  //3
    winter_1       //4
}
public enum Season_2 : long  //将枚举默认类型int改为long
{
    spring_2,  //0
    sunmmer_2, //1
    autumn_2,  //2
    winter_2   //3
}
class Program
{
    static void Main(string[] args)
    {
      Season_1 s2 = Season_1.autumn_1;
      Console.WriteLine(s2);  //显示spring_1,而不是autumn_1的原因是spring_1和autumn_1都是3,从前往后                                  //第一个3是spring_1,所以就输出spring_1
      Season_1 s3 = Season_1.spring_1;
        Console.WriteLine(s2 == s3);  //结果是true,表明spring_1和autumn_1是一样的
    }
 }

你可能感兴趣的:(C#)