zoukankan      html  css  js  c++  java
  • 不忘本~枚举

    返回目录

    嗨!又要和大家一起说说不忘本的文章了,其实我写的不忘本就是指定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就是微软给我们定义的超类
    我们定义的所有枚举很派生自它.
    返回目录
  • 相关阅读:
    说说该死的Google Android Market
    由HTML5绘制地图说开去
    unicode解码小工具
    IntelliJ IDEA 的安装、配置与使用
    再次强调!考试必带的十几样物品,一样也不能少
    Redis 实现限流的三种方式
    Linux配置/etc/resolv.conf详解
    人生哲学
    一文教你如何高效使用 IDEA !
    Mysql5.7.30_配置参数
  • 原文地址:https://www.cnblogs.com/lori/p/2094672.html
Copyright © 2011-2022 走看看