C#中的枚举(Enum)你知道多少呢?

简介:

写个随笔文章是最难想的,我要是写个C#枚举个人小结,估计博客园的各位园有也觉得是哪个刚接触C#的人写的,要是取个名字叫C#枚举,又觉得不能完全表达自己的意思,现在这个名字看起来还凑合吧,写篇文章不容易,大家且看且珍惜,文章的开头废话依然是很多,大家就将就一下,说个小事情,我个人写的文章不一定有什么技术含量,也不一定能解决什么高大上的问题,但是文章出自个人的辛苦研究总结所得,如果你抓取了我的请贴上文章链接,最恶心的莫过于红黑联盟,抓了文章不给链接(博文主页http://www.cnblogs.com/xiaofeixiang/),进入正题吧:

枚举(Enum)定义

enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。 但是,还可以将枚举嵌套在类或结构中。现在的有些电商网站根据购物的积分用到的,金牌会员,银牌会员,铜牌会员.

1
2
3
4
5
6
enum  MemberLevel
{
     gold,
     silver,
     copper

枚举值获取

一般获取的时候包括获取变量和变量值,默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。直接使用Enum中的静态方法即可操作.GetValues中获取的是枚举变量的值,类型是枚举名,之后自动输出的是枚举名.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string  s = Enum.GetName( typeof (MemberLevel), 3);
  Console.WriteLine(s);
 
  Console.WriteLine( "MemberLevel中的值:" );
  foreach  ( int  in  Enum.GetValues( typeof (MemberLevel)))
      Console.WriteLine(i);
  Console.WriteLine( "MemberLevel中的值(注意类型):" );
  foreach  (MemberLevel i  in  Enum.GetValues( typeof (MemberLevel)))
      Console.WriteLine(i);
 
  Console.WriteLine( "MemberLevel中的变量:" );
  foreach  ( string  str  in  Enum.GetNames( typeof (MemberLevel)))
      Console.WriteLine(str);
  System.Console.Read();

枚举类型

曾经很长的一段时间自己一度以为枚举的值只能是int类型,其实每种枚举类型都有基础类型,该类型可以是除 char以外的任何整型(重点)。 枚举元素的默认基础类型为 int.准许使用的枚举类型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。如果枚举值为long,如下所示:

1
2
3
4
5
6
enum  MemberLevel: long
{
     gold = 2147483648L,
     silver=232L,
     copper=10L
}

枚举Flags和Description特性值

可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。创建位标志枚举的方法是应用 System.FlagsAttribute 特性并适当定义一些值,以便可以对这些值执行 AND、OR、NOT 和 XOR 按位运算。一般情况下如果零值不表示“未设置任何标志”,则请不要为标志指定零值.

1
2
3
4
5
6
7
8
9
10
[Flags]
enum  MemberLevel
{
     [Description( "二进制表示为1----0001" )]
     gold = 0x1,
     [Description( "二进制表示为4----0010" )]
     silver = 0x04,
     [Description( "二进制表示为16----0100" )]
     copper = 0x10
}

  程序运行如下所示:

1
2
3
4
5
// 0001(Gold) and 0100(silver) => 0101(5).
MemberLevel options = MemberLevel.gold | MemberLevel.silver;
Console.WriteLine(options);
Console.WriteLine(( int )options);
System.Console.Read();

  上面的基本上属于入门的知识,在项目中通常用到的是在枚举变量上面加上Description,需要显示的枚举的特性值,枚举的值一般为int在数据库中占用空间比较小,枚举的变量用于给数据库中的字段赋值,那么如果要显示字段就需要考虑到Descripttion特性,显示中文名称,例如一个用户的的等级在数据中存储的是1,显示的时候显示为金牌用户,当然也可以使用switch,if..else..去判断,如果枚举比较多,自己写的也很不爽.特性这个时候刚发挥作用了,如下所示: 

1
2
3
4
5
6
7
8
9
10
[Description( "会员等级" )]
enum  MemberLevel
{
     [Description( "金牌会员" )]
     gold =1,
     [Description( "银牌会员" )]
     silver = 2,
     [Description( "铜牌会员" )]
     copper =3
}

首先来写一个扩展,静态类,静态方法,this关键字,istop主要是用来获取枚举上面的描述.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public  static  class  EnumHelper
{
     /// <summary>
     /// 返回枚举项的描述信息。
     /// </summary>
     /// <param name="value">要获取描述信息的枚举项。</param>
     /// <returns>枚举想的描述信息。</returns>
     public  static  string  GetDescription( this  Enum value,  bool  isTop =  false )
     {
         Type enumType = value.GetType();
         DescriptionAttribute attr =  null ;
         if  (isTop)
         {
             attr = (DescriptionAttribute)Attribute.GetCustomAttribute(enumType,  typeof (DescriptionAttribute));
         }
         else
         {
             // 获取枚举常数名称。
             string  name = Enum.GetName(enumType, value);
             if  (name !=  null )
             {
                 // 获取枚举字段。
                 FieldInfo fieldInfo = enumType.GetField(name);
                 if  (fieldInfo !=  null )
                 {
                     // 获取描述的属性。
                     attr = Attribute.GetCustomAttribute(fieldInfo, typeof (DescriptionAttribute),  false as  DescriptionAttribute;
                 }
             }
         }
 
         if  (attr !=  null  && ! string .IsNullOrEmpty(attr.Description))
             return  attr.Description;
         else
             return  string .Empty;
 
     }
}

  主程序调用如下所示:

1
2
3
MemberLevel gold = MemberLevel.gold;
Console.WriteLine(gold.GetDescription());
System.Console.Read();

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/3872142.html,如需转载请自行联系原作者

相关文章
|
6月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
66 0
|
1月前
|
C#
C# 枚举(Enum)
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。 C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
41 9
|
2月前
|
存储 C# 开发者
枚举与结构体的应用:C#中的数据组织艺术
在C#编程中,枚举(`enum`)和结构体(`struct`)是非常重要的数据类型。枚举用于定义命名常量集合,提高代码可读性;结构体则封装相关数据字段,适合小型数据集。本文从基本概念入手,探讨它们的使用技巧、常见问题及解决方案,帮助开发者更好地利用这些特性构建健壮的应用程序。
41 8
|
3月前
|
开发框架 .NET C#
C#语言进阶(四) 枚举器和迭代器
C#语言进阶(四) 枚举器和迭代器
34 0
|
6月前
|
安全 API C#
C#.Net筑基-类型系统②常见类型--枚举Enum
枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。
|
存储 C#
C#基础⑥.1——枚举、结构体
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。也就是一些固定范围的值。
【C#视频】常量、枚举、结构体、数组
【C#视频】常量、枚举、结构体、数组
|
存储 C#
C#基础Ⅵ❶-枚举、结构体
C#基础Ⅵ❶-枚举、结构体
|
7天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
19 3