枚举概念

枚举类型(也称为枚举)提供了一种有效的方式来定义可能分配给变量的一组已命名整数常量。该类型使用enum关键字声明。

示例代码1

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

默认情况下枚举中每个元素的基本类型都是int。可以使用冒号指定另一种整数类型。

示例代码2

enum Day : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

默认情况下,第一个枚举值具有值0,并且每个连续枚举数的值将增加1。

枚举数可以使用初始值设定项来替代默认值。

若设置某一枚举数的值,之后的枚举数仍然按1递增。

示例代码3

enum Day {Sat=1, Sun, Mon, Tue=5, Wed, Thu, Fri};

每个枚举都有一个基础类型,该基础类型可以是除char外的任何整数类型,枚举元素的默认基础类型是int。

已批准的枚举类型有byte、sbyte、short、ushort、int、uint、long或ulong。

可以为枚举类型的枚举器列表中的元素分配任何值,也可以使用计算值。

示例代码4

enum MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}

枚举方法

获取名称

public static string GetName(Type enumType, object value);

示例代码5

//获取Day枚举中Day.Friday的名称,返回值为"Friday"
System.Enum.GetName(typeof(Day), Day.Friday)

获取名称数组

public static string[] GetNames(Type enumType);

示例代码6

string[] names = System.Enum.GetNames(typeof(Day));

获取实例值得数组

public static Array GetValues(Type enumType);

实例代码7

Array arr = System.Enum.GetValues(typeof(Day));

将枚举常数的名称或数值的字符串表示转换成等效的枚举对象

public static object Parse(Type enumType, string value);

示例代码8

string day = Day.Friday.ToString();
var fri = (Day)System.Enum.Parse(typeof(Day),day);

相关常用方法可以参考枚举基类 System.Enum

作为位标志的枚举类型

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

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

示例代码9

[Flags]
enum Days
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}

枚举的位运算

|并集  &交集  ^差集  ~取反

为枚举拓展新方法

示例代码10

[Display(Name = "一周")]
public enum Day
{
  [Display(Name = "星期天")]
  Sunday,
  [Display(Name = "星期一")]
  Monday,
  [Display(Name = "星期二")]
  Tuesday,
  [Display(Name = "星期三")]
  Wednesday,
  [Display(Name = "星期四")]
  Thursday,
  [Display(Name = "星期五")]
  Friday,
  [Display(Name = "星期六")]
  Saturday
}
/// <summary>
/// 枚举拓展类
/// </summary>
public static class EnumExtend
{
  /// <summary>
  /// 根据System.ComponentModel.DataAnnotations下的DisplayAttribute特性获取显示文本
  /// </summary>
  /// <param name="t"></param>
  /// <returns></returns>
  public static string GetDisplayText(this Enum t)
  {
    var t_type = t.GetType();
    var fieldName = Enum.GetName(t_type, t);
    var objs = t_type.GetField(fieldName).GetCustomAttributes(typeof(DisplayAttribute), false);
    return objs.Length > 0 ? ((DisplayAttribute)objs[0]).Name : null;
  }
}

  

参考文献:枚举类型(C#编程指南)

C#枚举(Enum)小结的更多相关文章

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

    写个随笔文章是最难想的,我要是写个C#枚举个人小结,估计博客园的各位园有也觉得是哪个刚接触C#的人写的,要是取个名字叫C#枚举,又觉得不能完全表达自己的意思,现在这个名字看起来还凑合吧,写篇文章不容易 ...

  2. MySQL字段之集合(set)枚举(enum)

    MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it  分类:MySQL 集合 SET mysql> create table jihe(f1 ...

  3. 枚举 enum

    typedef enum : NSUInteger { <#MyEnumValueA#>, <#MyEnumValueB#>, <#MyEnumValueC#>, ...

  4. 枚举enum学习小记

    参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...

  5. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  6. Python 枚举 enum

    Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...

  7. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  8. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...

  9. C++和Java中枚举enum的用法

    在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...

  10. 【转】枚举enum学习小记

    原帖: http://hi.baidu.com/yuleishou/item/caacae872190031ec216272f 表示在vs2008下实验了一下,有些东西和原帖的还是不一样的,都贴在这里 ...

随机推荐

  1. CenOS_用户级别

    1.运行级别 共有7个运行级别: 0:关机 1:单用户(不用密码也能登陆) 2:多用户无网络 3:多用户有网络 4:保留 5:图形化界面 6:重启 1.1设置运行级别语法: init <级别数字 ...

  2. Hexo + GitHub 搭建个人博客

    对于程序员来说,搭建和维护一个个人博客十分必要​,写博客既是对所学知识的整理和总结,同时也能向他人展现自己的学习成果.这篇教程就是基于 Hexo 和 GitHub 来搭建属于自己的个人博客,简单快捷, ...

  3. 二维前缀和模板题:P2004 领地选择

    思路:就是使用二维前缀和的模板: 先放模板: #include<iostream> using namespace std; #define ll long long ; ll a[max ...

  4. SQL注入攻击的常见方式及测试方法

    本文主要针对SQL注入的含义.以及如何进行SQL注入和如何预防SQL注入让小伙伴有个了解.适用的人群主要是测试人员,了解如何进行SQL注入,可以帮助我们测试登录.发布等模块的SQL攻击漏洞,至于如何预 ...

  5. 内存压测工具Memtester

    在做压力测试时,发现一个内存压测工具Memtester,可以随意设置内存占用大小,非常方便 下载地址:http://pyropus.ca/software/memtester/old-versions ...

  6. 开源图像标注工具labelme的安装使用及汉化

    一 LabelMe简介 labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源. 项目开 ...

  7. BaiduSpeechDemo【百度语音SDK集成】(基于v3.0.7.3)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo将百度语音SDK(其中一部分功能)和自定义的UI对话框封装到一个module中,便于后续的SDK版本更新以及调用. 本De ...

  8. Java~命名规范

    下面总结以点java命名规范 虽然感觉这些规范比起C#来说有点怪,但还是应该尊重它的命名! 命名规范 项目名全部小写 包名全部小写 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. ...

  9. 104 - kube-scheduler源码分析 - predicate整体流程

    (注:从微信公众:CloudGeek复制过来,格式略微错乱,更好阅读体验请移步公众号,二维码在文末) 今天我们来跟一下predicates的整个过程:predicate这个词应该是“断言.断定”的意思 ...

  10. web scraper 抓取分页数据和二级页面内容

    如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...