不忘本~枚举

返回目录

嗨!又要和大家一起说说不忘本的文章了,其实我写的不忘本就是指定C#的一些基础知识,把基础知识从书面上拿出来,放到实践中去讲!咱领袖说的好:理论要联系实际吗!哈哈!

先看一个最简单的枚举enum吧

1    public enum UserBaseColumns
2 
3     {
4 
5         UserName = 1,
6 
7         Age = 2,
8 
9     }

 

我们如何去使用它呢,很简单,如果我们希望拿到UserBaseColumns.UserName这个枚举元素的值,可以这样写(int)UserBaseColumns.UserName,也就是强转换一下就OK了,因为枚举和数值类型可以直接转换的,如果希望得到UserName这个字符呢,即枚举元素的名称,我们可以这样:

Enum.GetName(UserBaseColumns.UserName.GetType(), UserBaseColumns.UserName)

其实为什么要使用枚举呢?这个问题是比它的基础知识更重要的,枚举对于程序员来说是提高了程序的可读性,对于使用程序的用户来说,没有任何意义;我们通常把一些具有固定值的对象创建为枚举对象,把一些经常发生变化的存储在数据表中,这也是程序设计的一个常识,例如,一个用户对象,它有一个状态字段,而这个字段只有"正常","删除","禁用"这三种值,那我们为了使用程序员在给对象赋值时的可读性强,就把这个字段设为枚举枚举类型,看代码:

 1  public enum Status
 2 
 3     {
 4 
 5         /// <summary>
 6 
 7         /// 正常
 8 
 9         /// </summary>
10 
11         Normal = 100,
12 
13         /// <summary>
14 
15         /// 删除
16 
17         /// </summary>
18 
19         Deleted = 400,
20 
21         /// <summary>
22 
23         /// 禁用
24 
25         /// </summary>
26 
27         Blocked = 500,
28 
29     }

 

而用户对象就变成了

 1      /// <summary>
 2 
 3     /// 用户实体
 4 
 5     /// </summary>
 6 
 7     public partial class UserBase : IDataEntity
 8 
 9     {
10 
11         /// <summary>
12 
13         /// 用户名
14 
15         /// </summary>
16 
17         public string UserName { get; set; }
18 
19         /// <summary>
20 
21         /// 年龄
22 
23         /// </summary>
24 
25         public int Age { get; set; }
26 
27         /// <summary>
28 
29         /// 状态
30 
31         /// </summary>
32 
33         public Status Status { get; set; }
34 
35     }

 

以上是枚举在程序开发中最基础的用法,现在我再来说说枚举的一些高级用法,枚举对象支持位运算,即它支持,加,减运算.

 1  [Flags]
 2 
 3     public enum UserBaseColumns
 4 
 5     {
 6 
 7         UserName = 1,
 8 
 9         Age = 2,
10 
11     }

 

这是加运算

1  UserBaseColumns enums = new UserBaseColumns();
2 
3  enums = UserBaseColumns.UserName | UserBaseColumns.Age;
这是减运算
1 enums = UserBaseColumns.UserName ^ (~UserBaseColumns.Age);
这是查看元素是否在枚举合的操作
1 if ((enums & UserBaseColumns.UserName) != 0)
2 
3                 Console.WriteLine("包括名字字段");
4 
5             else
6 
7                 Console.WriteLine("不包括名字字段");

在C#4.0中已经集成了判断元素是否在集合的方法:HasFlag

当然我们不提倡用4.0中的方法,因为如果你的frameworks是较低的版本时,这个HasFlag就报错了,

别外,还有一种将枚举转为字符,再去比较它是否存在于集合的方法,下面我给出代码:

 1      /// <summary>
 2 
 3     /// 自定义枚举指是否在枚举列表中
 4 
 5     /// </summary>
 6 
 7     public class HasEnum
 8 
 9     {
10 
11         private string[] EnumArray = null;
12 
13         public HasEnum(Enum enums)
14 
15         {
16 
17             this.EnumArray = Regex.Split(enums.ToString(), ",");
18 
19             if (this.EnumArray.Length < 1)
20 
21                 throw new Exception("输入参数异常");
22 
23         }
24 
25         public bool HasEnumFlags(Enum entity)
26 
27         {
28 
29             return EnumArray.Contains(Enum.GetName(entity.GetType(), entity));
30 
31         }
32 
33     }

 

好了,讲到这里,大家回去做个demo,自己实验一下吧!如果有疑问,请给我留言!

为了所有enum对象都是继承为Enum这个抽象类的.它是所有枚举对象的基类,所以在程序中我们经常这样写

      
 1  /// <summary>
 2 
 3         /// 更新指定字段
 4 
 5         /// </summary>
 6 
 7         /// <param name="entity"></param>
 8 
 9         /// <param name="enums"></param>
10 
11         void Update(IDataEntity entity, Enum enums);

 

上面的编程风格叫做面向接口编程,也叫面向超类编程!在这个例子中Enum就是微软给我们定义的超类
我们定义的所有枚举很派生自它.
返回目录
posted @ 2011-06-30 15:37  张占岭  阅读(736)  评论(6编辑  收藏  举报