• C#之枚举类型


    参考:

    http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html

    MSDN:

    https://msdn.microsoft.com/zh-cn/library/cc138362(v=vs.110).aspx

    枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用enum关键字声明的。

    1 enum Days{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
    2 enum Months : byte{Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}

    默认情况下,枚举中的每个元素的基础类型是int。可以使用冒号指定另一种整数值类型,如前面的示例所示。

     1 Days today = Days.Monday;
     2 int dayNumber = (int)today;
     3 Console.WriteLine("{0} is day number #{1}", today, dayNumber);
     4 
     5 Months thisMonth = Months.Dec;
     6 byte monthNumber = (byte)thisMonth;
     7 Console.WriteLine("{0} is month number #{1}", thisMonth, monthNumber);
     8 
     9 //Output:
    10 //Monday is day number #1
    11 //Dec is month number #11

    使用枚举而不是数值类型的好处:

    1. 明确为客户端代码指定哪些值是变量的有效值。
    2. 在Visual Studio中,IntelliSense列出定义的值。(此处不解???)

    如果未在枚举数列表中指定元素的值,则值将自动按1递增。在前面的示例中,Days.Sunday的值为0,Days.Monday的值为1,依此类推。创建新的Days对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday(0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则将所建的全部枚举都将具有该默认值。

    如果变量meetingDay的类型为Days,则只能将Days定义的某个值赋给它(无需显示强制转换)。如果会议日期更改,可以将Days中的新值赋给meetingDay:

    1 Days meetingDay = Days.Monday;
    2 //...
    3 meetingDay = Days.Sunday;

    可以将任意整数值赋值给meetingDay。例如,代码行meetingDay=(Days)42不会产生错误。但也不应该这样做,因为默认约定的是枚举变量只容纳枚举定义的值之一。将任意值赋给枚举类型的变量很有可能会导致错误。

    可以将任意值赋值给枚举类型的枚举数列表中的元素,也可以使用计算值:

    1 enum MachineState
    2 { 
    3     PowerOff = 0,
    4     Running = 5,
    5     Sleeping = 10,
    6     Hibernating = Sleeping+5
    7 }

    枚举类型作为位标志

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

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

    注:请一定注意此处的Flags,表示可以按位操作

     1 [Flags]
     2 enum Days2
     3 {
     4     None = 0x0,
     5     Sunday = 0x1,
     6     Monday = 0x2,
     7     Tuesday = 0x4,
     8     Wednesday = 0x8,
     9     Thursday = 0x10,
    10     Friday = 0x20,
    11     Saturday = 0x40
    12 }
    13 class MyClass
    14 {
    15     Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
    16 }

    若要在某个枚举上设置标志,请使用按位 OR 运算符,如下面的示例所示:

     1 // Initialize with two flags using bitwise OR.
     2 meetingDays = Days2.Tuesday | Days2.Thursday;
     3 
     4 // Set an additional flag using bitwise OR.
     5 meetingDays = meetingDays | Days2.Friday;
     6 
     7 Console.WriteLine("Meeting days are {0}", meetingDays);
     8 // Output: Meeting days are Tuesday, Thursday, Friday
     9 
    10 // Remove a flag using bitwise XOR.
    11 meetingDays = meetingDays ^ Days2.Tuesday;
    12 Console.WriteLine("Meeting days are {0}", meetingDays);
    13 // Output: Meeting days are Thursday, Friday

    若要确定是否设置了特定标志,请使用按位 AND 运算,如下面的示例所示:

    1 // Test value of flags using bitwise AND.
    2 bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
    3 Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
    4 // Output: Thursday is a meeting day

    使用System.Enum 方法发现和操作枚举值

    所有枚举都是System.Enum类型的实例。不能从System.Enum派生新类,但可以使用它的方法发现有关枚举实例中的值信息以及操作这些值。

     1 string s = Enum.GetName(typeof(Days), 4);
     2 Console.WriteLine(s);
     3 
     4 Console.WriteLine("The values of the Days Enum are:");
     5 foreach (int i in Enum.GetValues(typeof(Days)))
     6     Console.WriteLine(i);
     7 
     8 Console.WriteLine("The names of the Days Enum are:");
     9 foreach (string str in Enum.GetNames(typeof(Days)))
    10     Console.WriteLine(str);

     Enum的相关函数:

    1 [Flags]
    2 enum EColors
    3 { 
    4     Red=1,
    5     Green=2,
    6     Blue=4,
    7     Yellow=8
    8 }

    元素遍历:

    1 //遍历枚举类型的所有数据
    2 string[] strs = Enum.GetNames(typeof(EColors));
    3 foreach (string str in strs)
    4 {
    5     Console.WriteLine(str);
    6 }
    7 //Output:Red Green Blue Yellow

    单个元素转换:

    1 //获取单个枚举类型对应的字符串
    2 string strBlue = Enum.GetName(typeof(EColors), EColors.Blue);
    3 Console.WriteLine("颜色{0}表示{1}颜色!", EColors.Blue, strBlue);
    4 //Output:颜色Blue表示Blue颜色!

    获取枚举类型对应的数值:

    1 //获取枚举类型对应的数值
    2 int[] numbers = (int[])Enum.GetValues(typeof(EColors));
    3 foreach (int item in numbers)
    4 {
    5     Console.WriteLine(item);
    6 }
    7 //Output:1 2 4 8

    判断字符串是否对应枚举类型:

    1 //判断枚举类型是否存在
    2 Console.WriteLine("Green是否定义:" + Enum.IsDefined(typeof(EColors), "Green"));
    3 Console.WriteLine("green是否定义:" + Enum.IsDefined(typeof(EColors), "green"));
    4 //Output:
    5 //Green是否定义:True
    6 //green是否定义:False

    字符串转换为枚举类型:

    1 //枚举类型进行转换
    2 object o = Enum.Parse(typeof(EColors), "Green");
    3 EColors color = (EColors)o;
    4 Console.WriteLine("转换的颜色为:" + color);
    5 //Output:转换的颜色为:Green
  • 相关阅读:
    HashMap put get 源码解析
    HashMap 源码
    配置spring boot请求的入参和出参json数据格式
    配置idea的注释模板
    基本数据类型
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
  • 原文地址:https://www.cnblogs.com/imstrive/p/5440535.html
Copyright © 2020-2023  润新知