不忘本~枚举
嗨!又要和大家一起说说不忘本的文章了,其实我写的不忘本就是指定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就是微软给我们定义的超类
我们定义的所有枚举很派生自它.
返回目录