C#中enum类型,相较于其他基本数据类型来说比较特殊,他的本质上是一堆整数组成的结构体,并且支持与整型的显式转化。

既然是枚举类型,那么也就是说enum中的变量是不可以轻易改变的,所以C#将枚举类型认定成了static变量,在使用的时候与static变量一样(一组大写字母表示的是一个特定的类、枚举类型、命名空间或值),来声明使用:

CLASS.ENUM var_name = CLASS.ENUM.XXX;

或者在代码端头部加入

using static NAMESPACE;

写个随笔文章是最难想的,我要是写个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), falseas 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();

【转】C#中枚举类型与静态变量相关推荐

  1. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  2. 1vmware中的centos7配置静态变量

    vmware中的centos7配置静态变量 安装centos7时推荐最小化安装,避免占用过多资源 问题: 解决虚机中的Centos7连不上网 https://blog.csdn.net/u014271 ...

  3. c#和c++中枚举类型的区别(简)

    c#和c++中枚举类型的区别(简) C++中 枚举类型中的每个元素,可以直接使用,不必通过类型.元素的方式调用 没有++操作 #include <iostream> using names ...

  4. Android 中的Activity的静态变量问题

    请看,在一个Activity中定义了一个静态变量userUUID,然后在Service中引用,Service第一次启动的时的引用值,和将app手动kill掉后,Service会重启,然后重启的Serv ...

  5. java 调用枚举种方法_Java中枚举类型的一种使用方式

    今天改同事的代码发现同事的代码中有大量的if else语句.很不美观而且可读性太差. 因为需要给前端一个key,value的列表.这个列表写死.然而同事的代码. 放几张图,大家自己感受.我都不知道以后 ...

  6. C#中枚举类型enum的使用[转载]

    C#中枚举类型enum的使用 关于enum应用的总结(摘自http://hi.baidu.com/yangzhiping/blog/item/9d841fd5a4309dc451da4baa.html ...

  7. 看我72变:解决Entity Framework中枚举类型与tinyint的映射问题

    <看我72变>是蔡依林的一首歌,"我要洗心革面,人定可以胜天,梦想近在眼前..." 在代码世界中,有一种常见的"变" -- 类型转变.这篇文章分享的 ...

  8. Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存

    一 起源:枚举是一种特殊的数据类型,一般用来列举有限个.同类型的常量.它能保证参数的安全性,如方法声明传入的参数,必须是指定枚举中的常量.但是Android开发文档指出,使用枚举会比使用静态变量多消耗 ...

  9. java(18) - 枚举类型和静态导入

    一.枚举: 我们定义的枚举类都是继承于java.lang.Enum类,枚举中的每个成员默认都是 public static final. 枚举类型的使用是通过 枚举类名.值 的方式来调用. 对于枚举类 ...

最新文章

  1. 英伟达的雄心:成为AI时代的计算平台
  2. $(@_config=)什么意思?
  3. window.open 弹出居中窗口
  4. python中文件操作中不同的文件操作有何差异_Python学习基础篇 -6: Python中的文件操作...
  5. java poi之Excel的读取
  6. 分布式锁的 3 种实现方案!
  7. bigdecimal判断等于0_shell 脚本中if判断的条件总结
  8. 对前后端分离和FastDFS的使用的再理解
  9. ERROR 1010 (HY000): Error dropping database (can't rmdir './myapp', errno: 39)
  10. JavaScript高级知识点整理
  11. 集体智慧编程chapter5:优化问题
  12. springboot 优雅关闭_SpringBoot 2.3.0 优雅关闭 shutdown graceful
  13. 【Oracle】并行等待之PX Deq: Execute Reply
  14. 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强
  15. 日语学习之——五十音图
  16. mysql 创建表 create table详解
  17. 59.Mongoose
  18. “房山的房子会升值”--摘自《北京晚报》
  19. Unity3D ML-Agent-0.8.1 学习三(多代理学习)
  20. LINUX 宏__define_initcall(level,fn)的作用 和 do_initcalls()

热门文章

  1. 【C++深度剖析教程9】初探C++标准库
  2. 吞吐量(TPS)、QPS、并发数、响应时间(RT)
  3. Spyder kernel died 错误
  4. [deviceone开发]-do_RichLabel的简单示例
  5. MyISAM表加字段的特殊方法
  6. 细数改善WPF应用程序性能的10大方法
  7. VS2008 只生成DLL不生成lib文件
  8. 如何将SAP数据传输到其他系统(Transferring Data from SAP to Other Systems)
  9. 【数据结构与算法】堆
  10. 树莓派4b装系统_树莓派4B初次使用--系统安装|配置