• c# 枚举基础有[flags]和没有的的区别



    枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。在 C# 中,使用 enum 来声明枚举。

    枚举分为简单枚举标志枚举两种。

    基本语法示例

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

    以下格式也可以:

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

    枚举类型

    枚举类型可以是:byte、sbyte、short、ushort、int、uint、long、ulong,如果没有指定类型,则默认为 int 类型。指定类型示例:

    enum Day : byte { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    枚举数的值

    默认情况下,第一个枚举数的值为 0,后面每个枚举数的值在前一个枚举数的值基础上递增 1。当然,也可以自行指定,例如:

    enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat }; enum Range { MIN = 0, MAX = 255 }; enum Range2 { MIN, M1 = 50, M2, MAX = 255 }; //MIN 为 0,M2 为 51

    枚举数大小写敏感

    比如以下枚举有两个枚举数:

    enum EnumTest { Sun, sun }; //尽管如此,我们仍不推荐这样写

    取枚举数的值

    虽然枚举有类型,但取枚举数的值时,仍然需要进行类型转换。

    public partial class _ENUM : System.Web.UI.Page {     enum Range { MIN = 0, MAX = 255 };             protected void Page_Load(object sender, EventArgs e)     {         Response.Write(Range.MAX); //输出为:MAX         Response.Write("<br>");         Response.Write(((int)Range.MAX).ToString()); //输出为:255     } }

    枚举不能放在函数中

    枚举可以与类平级,也可以作为类的 field,但不能放在函数中。可以加 public 等修饰符。

     

     

     

    以下是使用枚举时几条好的建议。

    优先考虑使用枚举,而不是类的静态常量

    比如:

    public static class Day {     public static int Sun = 1;     public static int Mon = 2;     public static int Tue = 3;     //... }

    应该使用如下的枚举:

    enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };

    如果参数、返回值、变量等类型可以是枚举,则不要使用其它基础类型

    比如:

    Range r = Range.MAX; //好 int r = (int)Range.MAX; //不好

    枚举命名

    枚举一般使用名词或名词组合,简单枚举使用单数,标志枚举使用复数。

    大多数情况下不需要更改枚举的默认类型

    也就是说大多数情况下,使用 int(System.Int32)作为枚举类型。除非:

    • 枚举是标志枚举,且标志多于 32 个(此时 int 类型装不下)。     
    • 枚举被非常大量且频繁地使用,为了节约空间使用小于 int 的类型。     
    • 不得不使用其它类型的情况。

    不要在枚举中设置哨兵

    我们可能觉得在枚举的两端加上哨兵,这样在判断一个数是否在枚举中时,只需要判断是否在哨兵之中。非常不幸,我们不应该这么做,这破坏了枚举的意义。

    enum Day {FirstValue, Sun, Mon, Tue, Wed, Thu, Fri, Sat, LastValue }; //FirstValue、LastValue 应该去掉
     
    • 简单枚举包含的值不用于组合,也不用于按位比较。     
    • 标志枚举应使用按位 OR 操作进行组合。

    简单枚举

    前面提到的 Day、Range 都可以称之为简单枚举,因为不能将他们各自的值组合起来。

    标志枚举

    标志枚举的设计有两点要注意。

    • 指明 FlagsAttribute,以指示可以将枚举作为位域(即一组标志)处理。     
    • 枚举中各标志的值应该是以 2 的幂来赋值,即:1、2、4、8、16、32……

    举个例子,假如我们在设计 Windows 窗口程序,窗口有最小化、最大化、关闭按钮,我们想任意组合显示,也就是说我们可以显示其中的任意 0 个或一个或多个按钮。

    如果使用简单枚举,按照排列组合,我们要使用 1 + 3 + 3 + 1 = 8 个枚举数,如果这里不是三个按钮,而是四个按钮,枚举数就更多了。所以这样不现实。

    为什么这里使用简单枚举不现实呢?因为简单枚举不能组合,采用标志枚举就可以轻松解决了。

    [Flags] public enum WindowStyle {     MINIMUM_BUTTON = 1, //十六进制表示为 0x0001     MAXIMUM_BUTTON = 2,     CLOSE_BUTTON = 4 }

    我们在设置窗口样式时,利用 OR 自由组合:

    WindowStyle ws = WindowStyle.MINIMUM_BUTTON | WindowStyle.CLOSE_BUTTON; //表示既有 MINIMUM_BUTTON 也有 CLOSE_BUTTON

    这就是为什么标志的值要按 2 的幂排列的原因了,也是为什么标志多于 32 个时不能使用 int 类型的原因了。

    通常我们为常用的标志组合提供特殊的枚举值

    仍然以上述窗口为例,可知大多数情况下,我们均要显示这三个按钮,所以每次使用时都要用:

    WindowStyle ws = WindowStyle.MINIMUM_BUTTON | MAXIMUM_BUTTON | WindowStyle.CLOSE_BUTTON;

    实在有些繁琐,我们可以修改枚举为如下:

    [Flags] public enum WindowStyle {     MINIMUM_BUTTON = 1,     MAXIMUM_BUTTON = 2,     CLOSE_BUTTON = 4,     ALL_BUTTON = 7 }

    增加一个 ALL_BUTTON 为前三个标志的值。使用时直接用 ALL_BUTTON 就可以了。

     

     

    using System; using System.Collections.Generic; using System.Text; using System.Globalization;

    namespace test {     public enum Style:int       {         lenovo=1,         acer=2,         dell=3     }    

       public class PublicBLL     {        private int _itemtype;
           public static int ItemType        {            get            {                return _itemtype;            }            set { _itemtype = value; }        }    } }

    PublicBLL.ItemType返回的就是int型的1 or 2 or 3。

    如若判断其值是否等于一个枚举 if (PublicBll.ItemType==(int)Style.lenovo) { //代码段 }

     

  • 相关阅读:
    开发思路总结
    电脑蓝屏代码丢失,Eclipse这个功能帮我找回了代码
    书籍
    向日葵无法在控制端用键盘输入的原因
    js 多submit 不使其执行其他submit form
    js获取url参数值
    C# 正则表达式 去除HTML标签 C#后台
    读取txt文件 循环操作每行数据 添加到数据库
    Ubuntu中安装XAMPP出错的解决方法(转发,备查)
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/BoYu045535/p/3607153.html
Copyright © 2020-2023  润新知