C#基础 之 枚举enum

来源:互联网 发布:台步定点是什么知乎 编辑:程序博客网 时间:2024/06/01 21:59

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

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

  3、枚举使代码更易输入。

 

一、简单枚举

1 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。

2 枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。

3 枚举都是隐式密封的,不允许作为基类派生子类。

4 枚举类型的枚举成员均为静态,且默认为Int32类型。

5 每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。

6 枚举成员不能相同,但枚举的值可以相同。

7 枚举最后一个成员的逗号和大括号后面的分号可以省略。


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

方法

名称

CompareTo

将此实例与指定对象进行比较并返回一个对二者的相对值的指示

Equals

指示此实例是否等于指定的对象

Format

根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式

GetName

在指定枚举中检索具有指定值的常数的名称

GetNames

检索指定枚举中常数名称的数组

GetTypeCode

 返回此实例的基础 TypeCode

GetUnderlyingType

返回指定枚举的基础类型

GetValues

索指定枚举中常数值的数组

HasFlag

确定当前实例中是否设置了一个或多个位域

IsDefined

返回指定枚举中是否存在具有指定值的常数的指示

Parse

将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写

TryParse

将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值

 

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;  using System.Threading;    namespace WindowsApplication1  {      public partial class Form1 : Form      {          public Form1()          {              InitializeComponent();          }            //定义枚举类型          enum Days          {              Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday          }            private void button1_Click(object sender, EventArgs e)          {              DoWork(Days.Sunday);              DoWork(Days.Monday);          }            private void DoWork(Days day)          {              switch (day)              {                  case Days.Sunday:                      MessageBox.Show("星期天,河边钓鱼");                      break;                  case Days.Monday:                      MessageBox.Show("星期一,正常上班");                      break;              }          }      }  } 

    enum typeName // 定义枚举    {        value1,        value2,        value3    }            typeName varName;  //声明枚举变量            varName = typeName.value1;//给变量赋值    /* 默认为int类型,可以指定其他类型,有byte,sbyte,short,ushort,int,uint,long,ulong.     * 默认情况下,每个值会根据定义的顺序自动赋值,默认从0开始,递增1     */    enum orientation : byte    {        north = 1,        south = 2,        east = 3,        west = 4    }   orientation obj = (orientation)Enum.Parse(typeof(orientation), "east");//string转换为枚举值,值区分大小写!


枚举使用方法很多:

1、提取枚举成员的数字部分

2、提取枚举成员的名称

3、遍历所有枚举成员

4、将字符串转换成枚举对象。。。等

 

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;  using System.Threading;    namespace WindowsApplication1  {      public partial class Form1 : Form      {          public Form1()          {              InitializeComponent();          }          //定义枚举类型          enum Colors          {              Red = 1,              Blue = 2,              Green = 3,              Yellow = 4          }            private void button1_Click(object sender, EventArgs e)          {              //提取枚举成员中的数字,为4               int ncolor = (int)Colors.Yellow;              MessageBox.Show(ncolor.ToString());//显示验证一下对不对。                //提取枚举成员的名字,为“Red”              string strcolor = Colors.Red.ToString();              MessageBox.Show(strcolor);                //定义一个枚举对象              Colors cs = Colors.Yellow;              MessageBox.Show(cs.ToString());                //将 字符串 转换 枚举对象,不存在的字符串是不能转的              cs = (Colors)Enum.Parse(typeof(Colors), "Blue");              MessageBox.Show(cs.ToString());              //将 Int 转换 枚举对象            Color foo = (Color)yourInt;            Color foo = Enum.ToObject(typeof(Color) , yourInt);              //转换成功后,显示一下对应的值              ncolor = (int)cs;              MessageBox.Show(ncolor.ToString());                //遍历枚举,把枚举类型放进系统Type              //typeof()得到枚举类型对象              //得到Colors枚举类型对象中的符号名称数组              foreach (string s in Enum.GetNames(typeof(Colors)))              {                  MessageBox.Show(s);              }                //通过cs枚举对象的GetType方法获取枚举类型对象              //可以实现上面遍例枚举一样的效果              foreach (string s in Enum.GetNames(cs.GetType()))              {                  MessageBox.Show(s);              }          }      }  }  

 

二、标志枚举

标志枚举要在顶部加[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

 

转载自:http://blog.csdn.net/waterwan/article/details/8290350

http://www.cnblogs.com/kissdodog/archive/2013/01/16/2863515.html

 

0 0