C#枚举(enum)

枚举(enum)是什么?

1.枚举类型声明为一组相关的符号常数定义了一个类型名称。枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定。
枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用 enum 关键字声明的。

2。枚举是由一组特定常量构成的一组数据结构,是值类型的一种特殊形式,当需要一个由指定常量集合组成的数据类型时,使用枚举类型。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。 

在代码中使用枚举,可以将以前笨拙的代码变得优雅简单,更加直观,方便记忆。

3.枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。

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

枚举(enum)如何声明?

1.枚举类型是使用 enum 关键字声明的。 

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

默认情况下,枚举中每个元素的基础类型是 int。可以使用冒号指定另一种整数值类型。
如果不为枚举数列表中的元素指定值,则它们的值将以 1 为增量自动递增。在前面的示例中,Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推。创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。枚举中大小写敏感,但是建议不要这样。

2.声明枚举的一般语法:

enum <enum_name>
{ 
    enumeration list 
};

其中,

  • enum_name 指定枚举的类型名称。
  • enumeration list 是一个用逗号分隔的标识符列表。

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

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

枚举(enum)如何使用?

下面的实例演示了枚举变量的用法:

using System;
namespace EnumApplication
{
   class EnumProgram
   {
      enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

      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: 1
Friday: 5

简单枚举(enum)有哪些特点?

  • 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。
  • 枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。
  • 枚举都是隐式密封的,不允许作为基类派生子类。
  • 枚举类型的枚举成员均为静态,且默认为Int32类型。
  • 每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。
  • 枚举成员不能相同,但枚举的值可以相同。
  • 枚举最后一个成员的逗号和大括号后面的分号可以省略

枚举(enum)类有哪些方法?

C#提供类一个类来方便操作枚举,下面给出这个类的常用方法:

方法 名称
CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示
Equals 指示此实例是否等于指定的对象
Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式
GetName 在指定枚举中检索具有指定值的常数的名称
GetNames 检索指定枚举中常数名称的数组
GetTypeCode  返回此实例的基础 TypeCode
GetUnderlyingType 返回指定枚举的基础类型
GetValues 索指定枚举中常数值的数组
HasFlag 确定当前实例中是否设置了一个或多个位域
IsDefined 返回指定枚举中是否存在具有指定值的常数的指示
Parse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写
TryParse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值

如何显示指定枚举的底层数据类型?

要显示指定枚举的底层数据类型很简单,只需在声明枚举的时候加个冒号,后面紧跟要指定的数据类型。

    enum sex : byte  //显示指定枚举的底层数据类型
    { 
        male,
        female,  //此逗号可以省略
    };        //此分号可以省略

如何显示指定枚举的成员常量值?

显式设置枚举的成员常量值,默认是从0开始,逐个递增的。但是以下例子却设置成了1,2,3,4,5,6,7,0。而且成员值可以一样的。

    enum Week
    { 
        Monday = 1,
        Tuesday = 2,
        Wednesday = 3,
        Sunday = 0,
     Everyday = 1  //成员的值可以设置成一样的,但是成员不行
    }
  Console.WriteLine((int)Week.Monday);  //获取值

.NET中枚举的使用方法?

.NET中的枚举我们一般有两种常见用法,一是表示唯一的元素序列,例如一周里的各天,订单状态,文章类型等;还有就是用来表示多种复合的状态,例如表示权限,因为可同时有多个不同权限。

什么是标志枚举?

 2、标志枚举

  标志枚举要在顶部加[System.Flags]特性进行声明。而且枚举支持组合运算。先来看个例子

    class Program
    {
        static void Main(string[] args)
        {
            var man = Week.白 | Week.美;  //赋值为101    计算方法001或上100,结果是101
            Console.WriteLine((int)man);
            if ((man & Week.白) == Week.白)       //101 man 
            {                                    //001 白 逐位相与,
                Console.WriteLine("此人白");      //001 如果结果是白,就可以反推出man包含 白
            }
            else
            {
                Console.WriteLine("此人黑");
            }
            Console.ReadKey();
        }
    }

    [System.Flags]
    public enum Week
    { 
        白 = 1,  //001
        富 = 2,  //010
        美 = 4,  //100
    }

  这种位运算是非常有用的,在sql语句里也支持位运算。也就是说,把一个枚举运算后的结果存入数据库之后,还能够按照你的要求读取出来。比如:

  将一个"白美"存如数据库的值存入数据库,那么存入去的就是整型5。

  那么我想读出所有的"白"数据列表怎么读呢?白,可以是纯白"1",也是是白富3,可以是白美5,也可以是白富美7,你可以用in来读,但是更好的方法是在sql语句中同样使用位运算。

select * from Table1 where Tag & 1 = 1  //Tag是列名

select * from Table1 where  Tag | 1 = Tag

简单枚举,不能将他们各自的值组合起来。

标志枚举的设计有两点要注意。

  • 指明 FlagsAttribute,以指示可以将枚举作为位域(即一组标志)处理。
  • 枚举中各标志的值应该是以 2 的幂来赋值,即:1、2、4、8、16、32……

举个例子,假如我们在设计 Windows 窗口程序,窗口有最小化、最大化、关闭按钮,我们想任意组合显示,也就是说我们可以显示其中的任意 0 个或一个或多个按钮。

如果使用简单枚举,按照排列组合,我们要使用 1 + 3 + 3 + 1 = 8 个枚举数,如果这里不是三个按钮,而是四个按钮,枚举数就更多了。所以这样不现实。

为什么这里使用简单枚举不现实呢?因为简单枚举不能组合,采用标志枚举就可以轻松解决了。

[Flags]
public enum WindowStyle
{
    MINIMUM_BUTTON = 1, //十六进制表示为 0x0001
    MAXIMUM_BUTTON = 2,
    CLOSE_BUTTON = 4
}

我们在设置窗口样式时,利用 OR 自由组合:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | WindowStyle.CLOSE_BUTTON; //表示既有 MINIMUM_BUTTON 也有 CLOSE_BUTTON

这就是为什么标志的值要按 2 的幂排列的原因了,也是为什么标志多于 32 个时不能使用 int 类型的原因了。

通常我们为常用的标志组合提供特殊的枚举值

仍然以上述窗口为例,可知大多数情况下,我们均要显示这三个按钮,所以每次使用时都要用:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | MAXIMUM_BUTTON | WindowStyle.CLOSE_BUTTON;

实在有些繁琐,我们可以修改枚举为如下:

[Flags]
public enum WindowStyle
{
    MINIMUM_BUTTON = 1,
    MAXIMUM_BUTTON = 2,
    CLOSE_BUTTON = 4,
    ALL_BUTTON = 7
}

增加一个 ALL_BUTTON 为前三个标志的值。使用时直接用 ALL_BUTTON 就可以了。

枚举(enum)的优点是什么?

1.枚举的优点:
枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。

枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。

枚举使代码更易于键入。在给枚举类型的实例赋值时,VS.NET IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数,并能够让我们回忆起可能的值

2.枚举的优点

枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。

枚举使代码更易于维护,有助于确保给变量指定合法的、期望的值。

枚举使代码更易输入。

枚举(enum)适用于什么场合?

枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

        例1:一个字段表示类型。你可以使用整数1、2、3代表原创转载翻译三种类型。这种表示法可以使用,但它不直观。此时应该使用枚举。

        例2:表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是应该定义成一个枚举。

枚举与整型之间如何显式转换?

enum Color
 {
            RED,GREEN,BLUE
  }

枚举转换为整形
int a = (int)Color.RED;

整形转换为枚举
Color c;
c = (Color) 1;
转换为同一类型,便于比较。

猜你喜欢

转载自blog.csdn.net/qq_40741855/article/details/83832026