C# - 枚举

一、枚举的定义:enum

 

声明一个枚举Day

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

以下格式也可以:

enum Day(表示一个枚举)

{

    Sun,(表示一个枚举数),隐含的Sun的值为00表示枚举数的值

    Mon,

    Tue,

    Wed,

    Thu,

    Fri,

    Sat

};

 

枚举类型可以是:bytesbyteshortushortintuintlongulong,如果没有指定类型,则默认为 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 0M2 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 等修饰符。

 

二、使用枚举时的建议:

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

比如:

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 };

 

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

比如:

Range r = Range.MAX; //

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

 

3、枚举命名

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

 

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

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

·枚举是标志枚举,且标志多于 32 个(此时 int 类型装不下)。

·枚举被非常大量且频繁地使用,为了节约空间使用小于 int 的类型。

·不得不使用其它类型的情况。

 

5、不要在枚举中设置哨兵

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

enum Day {FirstValue, Sun, Mon, Tue, Wed, Thu, Fri, Sat, LastValue }; //FirstValueLastValue 应该去掉

 

三、简单枚举和标志枚举

1、简单枚举

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

简单枚举包含的值不用于组合,也不用于按位比较。

 

2、标志枚举

       标志枚举应使用按位 OR 操作进行组合。

 

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

·指明 FlagsAttribute,以指示可以将枚举作为位域(即一组标志)处理。

·枚举中各标志的值应该是以 2 的幂来赋值,即:12481632……

 

举个例子,假如我们在设计 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)

{

//代码段

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值