源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

理解C#中的枚举(简明易懂)

  • 时间:2020-03-22 06:54 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:理解C#中的枚举(简明易懂)
[b]一、在学习枚举之前,首先来听听枚举的优点。[/b]   1、枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。   2、枚举使代码更易于维护,有助于确保给变量指定合法的、期望的值。   3、枚举使代码更易输入。 [b]二、枚举说明[/b] [b]1、简单枚举[/b] ●枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。 ●枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。 ●枚举都是隐式密封的,不允许作为基类派生子类。 ●枚举类型的枚举成员均为静态,且默认为Int32类型。 ●每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。 ●枚举成员不能相同,但枚举的值可以相同。 ●枚举最后一个成员的逗号和大括号后面的分号可以省略 C#提供类一个类来方便操作枚举,下面给出这个类的常用方法: [img]http://files.jb51.net/file_images/article/201505/201551993313062.png?201541993325[/img] 要显示指定枚举的底层数据类型很简单,只需在声明枚举的时候加个冒号,后面紧跟要指定的数据类型。
[u]复制代码[/u] 代码如下:
    enum sex : byte  //显示指定枚举的底层数据类型     {         male,         female,  //此逗号可以省略     };        //此分号可以省略'
  显式设置枚举的成员常量值,默认是从0开始,逐个递增的。但是以下例子却设置成了1,2,3,4,5,6,7,0。而且成员值可以一样的。
[u]复制代码[/u] 代码如下:
    enum Week     {         Monday = 1,         Tuesday = 2,         Wednesday = 3,         Sunday = 0,      Everyday = 1  //成员的值可以设置成一样的,但是成员不行     }   Console.WriteLine((int)Week.Monday);  //获取值
  示例,由枚举值获取枚举名称与由枚举名称获取枚举值
[u]复制代码[/u] 代码如下:
class Program     {         static void Main(string[] args)         {             Console.WriteLine(Enum.GetName(typeof(Man),1));  //还是 刘备 (由值获取名字)             string[] array1 = Enum.GetNames(typeof(Man));             Console.WriteLine(array1[1]);   //关羽             Array array2 = Enum.GetValues(typeof(Man));             Console.WriteLine(array2.GetValue(1));  //还是关羽             Type t = Enum.GetUnderlyingType(typeof(Man));             Console.WriteLine(t);       //输出 Int32             //由值获取内容             int i = 1;             string Name = Enum.Parse(typeof(Man), i.ToString()).ToString();     //此时 Name="刘备"             Console.WriteLine(Name);             //由值获取内容             string Name2 = "关羽";             int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2));     //此时 j=2             Console.WriteLine(j);             Console.ReadKey();         }     }     enum Man     {         刘备 = 1,         关羽 = 2,         张飞 = 3     }
[b]2、标志枚举[/b]   标志枚举要在顶部加[System.Flags]特性进行声明。而且枚举支持组合运算。先来看个例子
[u]复制代码[/u] 代码如下:
class Program     {         static void Main(string[] args)         {             var man = Week.白 | Week.美;  //赋值为101    计算方法001或上100,结果是101             Console.WriteLine((int)man);             if ((man & Week.白) == Week.白)       //101 man             {                                    //001 白 逐位相与,                 Console.WriteLine("此人白");      //001 如果结果是白,就可以反推出man包含 白             }             else             {                 Console.WriteLine("此人黑");             }             Console.ReadKey();         }     }     [System.Flags]     public enum Week     {         白 = 1,  //001         富 = 2,  //010         美 = 4,  //100     }
 这种位运算是非常有用的,在sql语句里也支持位运算。也就是说,把一个枚举运算后的结果存入数据库之后,还能够按照你的要求读取出来。比如:   将一个"白美"存如数据库的值存入数据库,那么存入去的就是整型5。   那么我想读出所有的"白"数据列表怎么读呢?白,可以是纯白"1",也是是白富3,可以是白美5,也可以是白富美7,你可以用in来读,但是更好的方法是在sql语句中同样使用位运算。
[u]复制代码[/u] 代码如下:
select * from Table1 where Tag & 1 = 1  //Tag是列名 select * from Table1 where  Tag | 1 = Tag
[b]三、枚举的使用建议[/b]   当参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)   大多数情况下都可以使用int类型枚举,下列情况除外。   枚举可能被大量频繁的使用,这时为了节约空间可以使用小于int类型的枚举。   标志枚举,且标志多于32个。   下面写一个:枚举绑定MVC3下拉列表的示例:   控制器代码:
[u]复制代码[/u] 代码如下:
namespace MvcStart.Controllers {     public class HomeController : Controller     {         public ActionResult GetSexList()         {             Dictionary<string, int> Sexlist = new Dictionary<string, int>();             string[] keys = Enum.GetNames(typeof(sex));             Array values = Enum.GetValues(typeof(sex));             for (int i = 0; i < keys.Length; i++)             {                 Sexlist.Add(keys[i], (int)values.GetValue(i));             }             return View(Sexlist);         }     }     public enum sex     {         male = 1,         female = 2,         other = 3     } }
视图代码:
[u]复制代码[/u] 代码如下:
@model Dictionary<string, int> <select>     @foreach(var item in @Model)     {         <option value="@item.Value">@item.Key</option>     } </select>
生成的HTML代码:
[u]复制代码[/u] 代码如下:
<select>         <option value="1">male</option>         <option value="2">female</option>         <option value="3">other</option> </select>
再来一个例子,获取枚举描述
[u]复制代码[/u] 代码如下:
public static class GetDescription     {         /// <summary>         /// 获取描述信息         /// </summary>         /// <param name="en"></param>         /// <returns></returns>         public static string description(this Enum en)         {             Type type = en.GetType();             MemberInfo[] memInfo = type.GetMember(en.ToString());             if (memInfo != null && memInfo.Length > 0)             {                 object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);                 if (attrs != null && attrs.Length > 0)                     return ((DescriptionAttribute)attrs[0]).Description;             }             return en.ToString();         }     }     public enum Sex     {         [Description("男")]         man = 1,         [Description("女")]         woman = 2,         [Description("其他")]         other = 3     }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部