参考:

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关键字声明的。

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

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

 Days today = Days.Monday;
int dayNumber = (int)today;
Console.WriteLine("{0} is day number #{1}", today, dayNumber); Months thisMonth = Months.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}", thisMonth, monthNumber); //Output:
//Monday is day number #1
//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:

 Days meetingDay = Days.Monday;
//...
meetingDay = Days.Sunday;

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

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

 enum MachineState
{
PowerOff = ,
Running = ,
Sleeping = ,
Hibernating = Sleeping+
}

枚举类型作为位标志

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

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

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

 [Flags]
enum Days2
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
class MyClass
{
Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

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

 // Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday; // Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday; Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday // Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

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

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

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

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

 string s = Enum.GetName(typeof(Days), );
Console.WriteLine(s); Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
Console.WriteLine(i); Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
Console.WriteLine(str);

Enum的相关函数:

 [Flags]
enum EColors
{
Red=,
Green=,
Blue=,
Yellow=
}

元素遍历:

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

单个元素转换:

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

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

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

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

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

字符串转换为枚举类型:

 //枚举类型进行转换
object o = Enum.Parse(typeof(EColors), "Green");
EColors color = (EColors)o;
Console.WriteLine("转换的颜色为:" + color);
//Output:转换的颜色为:Green

C#之枚举类型的更多相关文章

  1. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

  2. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  3. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  4. 在WPF中使用变通方法实现枚举类型的XAML绑定

    问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...

  5. 窥探Swift之别样的枚举类型

    想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...

  6. C#枚举类型的常用操作总结

    枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...

  7. TypeScript中的枚举类型

    TypeScript拓展了Javascript原生的标准数据类型集,增加了枚举类型(enmu)和其他语言一 样 它提供我们一种数字类型的值,用来设置由于辨别的名字和方法 enum Students { ...

  8. Python 中的枚举类型~转

    Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...

  9. java 枚举类型 构造函数及用法

    // 1. 定义枚举类型 public enum Light { // 利用构造函数传参 RED (1), GREEN (3), YELLOW (2); // 定义私有变量 private int n ...

  10. .NET 中关于 TypeCode 和枚举类型的问题

    因为C#中没有提供 Switch on Type 的功能,因此要判断类型通常会用一长串的if else,当然这种写法的问题是不够高效,且不够美观.因此 C# 中对常见类型提供了一组枚举值,也就是 Ty ...

随机推荐

  1. I got a plan in 2014

    工作快3年了,始终逃脱不出一种混日子打酱油的赶脚,一切都似乎是在虚度. 最近好像有患上很严重的拖延症,工作上总是分散精力,无法聚集自己的事情. 开始这个博客,希望记录一些有用文字,不管是工作.生活,还 ...

  2. Linux下显示ip所属位置

    在linux下,要是网络出现延迟,通常我们需要分析自己到对端的服务器的网络环境 例:ping www.baidu.com traceroute www.baidu.com 通过分析来确定大概是什么问题 ...

  3. sqlserver权限体系(下)

    简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安全对象以及所对应的权限. 理解安全对象(Securable) 安全对象,是SQL Server 数据库引擎授权系统控制 ...

  4. jQuery简单实现iframe的高度根据页面内容自适应的方法

    同域下: //注意:下面的代码是放在和iframe同一个页面中调用 $("#myiframe").load(function () { var myiframeH = $(this ...

  5. Linux平台延时之sleep、usleep、nanosleep、select比较

    Linux平台延时之sleep.usleep.nanosleep.select比较 标签: 嵌入式thread线程cpu多线程 2015-05-05 15:28 369人阅读 评论(0) 收藏 举报 ...

  6. 弹出框四 之toastr.js (完成提示框)

    1.下载 toastr.js组件 2. $(function () { toastr.success('提交数据成功'); toastr.error('Error'); toastr.warning( ...

  7. Emoji表情符号录入MySQL数据库报错的解决方案(MySQL utf8与utf8mb4区别)

    本文转自:http://blog.itpub.net/26230597/viewspace-1243233/前言:手机app应用评论的时候,恢复表情符号,提示失败. 1,查看tomcat后台日志,核心 ...

  8. spring缓存Ehcache(入门2)源码解读

    Ehcache缓存: 解读: Ehcache缓存是在继承spring缓存核心类CacheManager的基础上实现的. 常用类: EhCacheCacheManager:继承自CacheManager ...

  9. 【PHP面向对象(OOP)编程入门教程】22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法

    有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...

  10. ubutu之mysql emma中文乱码问题解决

    emma默认用apt-get 安装的话,emma是不支持中文的,配置文件或直接修改emma程序源文件(python).apt-get安装emmasudo apt-get install emma    ...