c#中enum的用法小结

转自:http://blog.csdn.net/moxiaomomo/article/details/8056356

enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储。

(1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下两个代码定义是等价的:

 

[csharp] view plaincopy
 
  1. enum TrafficLight  
  2. {  
  3.     Green,  
  4.     Yellow,  
  5.     Red  
  6. }  
[csharp] view plaincopy
 
  1. enum TrafficLight  
  2. {  
  3.     Green = 0,  
  4.     Yellow = 1,  
  5.     Red = 2  
  6. }  


(2)enum枚举类型的变量的名字不能相同,但是值可以相同,例如:

 

 

[csharp] view plaincopy
 
  1. enum TrafficLight  
  2. {  
  3.     Green = 0,  
  4.     Yellow = 1,     // Duplicate value, OK   
  5.     Red = 1         // Duplicate value, OK   
  6. }  

(3)如果enum中的部分成员显式定义了值,而部分没有;那么没有定义值的成员还是会按照上一个成员的值来递增赋值,例如:

 

 

[csharp] view plaincopy
 
  1. enum LoopType  
  2. {  
  3.     None,          // value is 0    
  4.     Daily,         // value is 1    
  5.     Weekly = 7,  
  6.     Monthly,       // value is 8    
  7.     Yeayly,        // value is 9    
  8.     DayGap = 15,           
  9.     WeekGap,       // value is 16    
  10.     MonthGap,      // value is 17    
  11.     YearGap        // value is 18    
  12. }  

(4)enum枚举成员可以用来作为位标志,同时支持位的操作(位与,位或等等),例如:

 

 

[csharp] view plaincopy
 
  1. enum CardDeckSettings : uint  
  2. {  
  3.     SingleDeck = 0x01,      // Bit 0  
  4.     LargePictures = 0x02,   // Bit 1  
  5.     FancyNumbers = 0x04,    // Bit 2  
  6.     Animation = 0x08        // Bit 3      
  7. }  

十六进制数的一个作用就是用来进行位运算和操作,很方便。

下面的转自另外一篇博客:

今天来的时候打开了MSDN扫了一眼C#里的枚举类型~~ 蓦然发现这东西还有些新玩法。

首先是简单介绍,……在此略过。因为enum用法很简单么~

定义一个简单的枚举类型:
   enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};        //这时候         Days.Sat = 0 ,后面依此递增。

当然也可以手动指定起始值:
   enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; //这样就从1开始了。

          枚举型的隐含类型为 int 型, 例如 int x=(int)Days.Sat ; 一点问题没有。据MSDN说枚举类型的隐含类型可以为除了char以外的任意数字类型……        [        Every enumeration type has an underlying type, which can be any integral type except char. ]
          下面这个例程演示使用长整型作为枚举的隐含类型:

// keyword_enum2.cs
// Using long enumerators

using System;
public class EnumTest 
{
    enum Range :long {Max = 2147483648L, Min = 255L};
    static void Main() 
          {
       long x = (long)Range.Max;
       long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
          }
}
如果需要重新取回长整形值,也是一个转换就可以了。  long x = (long)Range.Max;

最有意思的还是下面要说的,enum的[Flags]标记。啥也不说啦,看程序吧:
//The following code example illustrates the use and effect of the 
//System.FlagsAttribute attribute on an enum declaration.


// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;

[Flags]
public enum FileAttribute
{
         ReadOnly= 0x01,
         Hide= 0x02,
         System= 0x04,
         Archived= 0x08
}

class FlagTest
{
    static void Main()
         {
        FileAttributeoptions options= FileAttribute.ReadOnly| FileAttribute.System;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
         }
}

输出为:
       
ReadOnly, System
5
看到了吧?呵呵。这就是常用的标志位阿~ 在C#里变得更简单易用了。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

1> 我给定一个值1,怎样把对应的Sun以字符串的形式返回来?(常用在取数据库里的XXX_ID并转换成对应的值的时候用。——不过有点硬编码的感觉。)
答:Convert.ChangeType( enumValue, enumType ).ToString();// enumValue=1; enumType=typeof(Days)

2>我给定一个字符串"Sun",怎么返回enum Day.Sun?
答: 可以直接用 Enum.Parse( enumType, string,[boolean])来解决问题. ;例如这个例子, Enum.Parse(typeof(Day), "Sun", true) 就返回Day.Sun , 第3个参数指定是否大小写敏感. 可以省略.

3>我想知道 enum Day 中所有的字符串值. 怎么写?
答: 这个貌似也很简单哦, foreach(string name in Enum.GetNames(typeof(Day))) Console.WriteLine(name);   还有一个Enum.GetName() ,具体用法看MSDN去吧....

posted @ 2015-05-07 21:06  Run_For_Love  阅读(1003)  评论(0编辑  收藏  举报