深入理解C#之枚举

目录
  • 一、在学习枚举之前,首先来听听枚举的优点。
  • 二、枚举说明
    • 1、简单枚举
    • 2、标志枚举
  • 三、枚举的使用建议
  • 总结

一、在学习枚举之前,首先来听听枚举的优点。

1、枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。

2、枚举使代码更易于维护,有助于确保给变量指定合法的、期望的值。

3、枚举使代码更易输入。

二、枚举说明

1、简单枚举

  • 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。
  • 枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。
  • 枚举都是隐式密封的,不允许作为基类派生子类。
  • 枚举类型的枚举成员均为静态,且默认为Int32类型。
  • 每个枚举成员均具有相关联的常数值。
  • 此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。
  • 枚举成员不能相同,但枚举的值可以相同。
  • 枚举最后一个成员的逗号和大括号后面的分号可以省略

C#提供类一个类来方便操作枚举,下面给出这个类的常用方法:

方法 名称
CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示
Equals 指示此实例是否等于指定的对象
Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式
GetName 在指定枚举中检索具有指定值的常数的名称
GetNames 检索指定枚举中常数名称的数组
GetTypeCode 返回此实例的基础 TypeCode
GetUnderlyingType 返回指定枚举的基础类型
GetValues 索指定枚举中常数值的数组
HasFlag 确定当前实例中是否设置了一个或多个位域
IsDefined 返回指定枚举中是否存在具有指定值的常数的指示
Parse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写
TryParse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值

要显示指定枚举的底层数据类型很简单,只需在声明枚举的时候加个冒号,后面紧跟要指定的数据类型。

   enum sex : byte  //显示指定枚举的底层数据类型
    {
        male,
        female,  //此逗号可以省略
    };        //此分号可以省略

显式设置枚举的成员常量值,默认是从0开始,逐个递增的。但是以下例子却设置成了1,2,3,4,5,6,7,0。而且成员值可以一样的。

enum Week
    {
        Monday = 1,
        Tuesday = 2,
        Wednesday = 3,
        Sunday = 0,
     Everyday = 1  //成员的值可以设置成一样的,但是成员不行
    }
  Console.WriteLine((int)Week.Monday);  //获取值

示例,由枚举值获取枚举名称与由枚举名称获取枚举值

    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
    }

2、标志枚举

标志枚举要在顶部加[System.Flags]特性进行声明。而且枚举支持组合运算。先来看个例子

  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语句中同样使用位运算。

select * from Table1 where Tag & 1 = 1  //Tag是列名
select * from Table1 where  Tag | 1 = Tag

三、枚举的使用建议

当参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)

大多数情况下都可以使用int类型枚举,下列情况除外。

枚举可能被大量频繁的使用,这时为了节约空间可以使用小于int类型的枚举。

标志枚举,且标志多于32个。

下面写一个:枚举绑定MVC3下拉列表的示例:

控制器代码:

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

视图代码:

@model Dictionary<string, int>
<select>
    @foreach(var item in @Model)
    {
        <option value="@item.Value">@item.Key</option>
    }
</select>

生成的HTML代码:

<select>
        <option value="1">male</option>
        <option value="2">female</option>
        <option value="3">other</option>
</select>

再来一个例子,获取枚举描述

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)

相关推荐

  • 简述C#枚举高级战术

    文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要用枚举表示,且一个用户可能会拥有多个角色. 映入你脑海的第一个答案可能是:varchar 类型,用分隔符的方式来存储多个角色,比如用 1|2|3 或 1,2,3 来表示用户拥有多个角色.当然如果角色数量可能超过个位数,考虑到数据库的查询方便(比如用 INSTR 或 POSITION

  • C# 枚举类型的声明和使用

    目录 前言 相关介绍 一.枚举声明 二.声明位置 三.枚举使用 总结 前言 学习记录下枚举的声明和使用,枚举可用来规范开发 文章中代码的项目名为Project1,C#类名为Class1 相关介绍 微软官方C#函数文档 一.枚举声明 声明的方式:enum [枚举名] {值1, 值2, ..., 值n} 对于最后一个值,逗号可以写,也可以不写对于文字,值不需要使用引号引起来 enum Gender { 男, 女 } 二.声明位置 可以声明在namespace命令空间内 using System; u

  • C# 解决在Dictionary中使用枚举的效率问题

    使用字典的好处 System.Collections.Generic命名空间下的Dictionary,它的功能非常好用,且功能与现实中的字典是一样的. 它同样拥有目录和正文,目录用来进行第一次的粗略查找,正文进行第二次精确查找.通过将数据进行分组,形成目录,正文则是分组后的结果.它是一种空间换时间的方式,牺牲大的内存换取高效的查询效率.所以,功能使用率查询>新增时优先考虑字典. public static Tvalue DicTool<Tkey, Tvalue>(Tkey key, Di

  • C# 枚举的使用简介

    枚举这个名词大家都听过,很多小伙伴也使用过, 那么枚举在开发中能做什么,使用它后能给程序代码带来什么改变,为什么用枚举. 各位看官且坐下,听我一一道来. 为什么使用枚举? 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入和读取. 枚举有哪些用法? 1.简单枚举 2.标志枚举 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.

  • C# 实现枚举转列表

    今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表.想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下,提取了三个方法,后来在常用代码工具库也看到一个方法,所以总共四个方法,分为两组,功能可以说都是一样的,就是形式不同,现在分享给大家. #region 获取枚举列表 /// <summary> /// 通过枚举对象获取枚举列表 /// </summary> /// <typeparam name=&

  • 深入理解C#之枚举

    目录 一.在学习枚举之前,首先来听听枚举的优点. 二.枚举说明 1.简单枚举 2.标志枚举 三.枚举的使用建议 总结 一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和inter

  • 详解Swift中enum枚举类型的用法

    一.引言 在Objective-C语言中,没有实际上是整型数据,Swift中的枚举则更加灵活,开发者可以不为其分配值类型把枚举作为独立的类型来使用,也可以为其分配值,可以是字符,字符串,整型或者浮点型数据. 二.枚举语法 Swift中enum关键字来进行枚举的创建,使用case来创建每一个枚举值,示例如下: //创建姓氏枚举,和Objective-C不同,Swift枚举不会默认分配值 enum Surname { case 张 case 王 case 李 case 赵 } //创建一个枚举类型的

  • TypeScript魔法堂之枚举的超实用手册

    前言 也许前端的同学会问JavaScript从诞生至今都没有枚举类型,我们不是都活得挺好的吗?为什么TypeScript需要引入枚举类型呢? 也许被迫写前端的后端同学会问,TypeScript的枚举类型是和Java/.NET的一样吗? 下面我们来一起探讨和尝试解答吧! 前端一直都需要枚举 我敢保证,前端的同学都会万分肯定地告诉大家:我们从来没有写过枚举.那是因为虽然ECMAScript将enum作为保留字,但至ES2020为止还没有提出枚举的实现规范.语言没有提供规范和语言实现,不代表思想活跃勇

  • C语言简明清晰讲解枚举

    目录 概述 简单使用 入门 判断 自定义数值 一种不严格的写法 概述 一个类型,值只能是一堆值中的一个. 比如星期几,只会是星期一到星期天. 用数值表示的话就是0到6,但是0到6不太好理解. 而枚举可以用单词表示,提高了可读性. 本质上还是0到6. 简单使用 入门 新建三个变量,值分别为a b c #include<stdio.h> enum Gender { Male, Female, Empty }; int main() { enum Gender a = Male; enum Gend

  • 实例讲解iOS中的UIPageViewController翻页视图控制器

    一.引言 UIPageViewController是iOS中少见的动画视图控制器之一,通过它既可以创建类似UIScrollView与UIPageControl结合的滚屏视图,也可以创建类似图书效果的炫酷翻页视图. UIPageViewController在iOS 5 SDK中首次引入,它使得开发者可以使用这个ViewController创建分页视图.在iOS 6中,这个类有了更新,支持滚动过渡效果.使用Page View,用户可以方便的通过手势在多个页面之间导航.UIPageViewContro

  • TypeScript中枚举类型的理解与应用场景

    目录 一.是什么 二.使用 数字枚举 字符串枚举 异构枚举 本质 三.应用场景 总结 一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表示星期的SUNDAY.MONDAY.TUESDAY.WEDNESDAY.THURSDAY.FRIDAY.SATURDAY就可以看成是一个枚举 枚举的说明与结构和联合相似,其形式为: enum 枚举名{     标识

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

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 ●枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. ●枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类型,继承

  • 深入理解C#中的枚举

    枚举类型是一种的值类型,它用于声明一组命名的常数. (1)枚举的声明:枚举声明用于声明新的枚举类型.访问修辞符 enum 枚举名:基础类型 复制代码 代码如下: {        枚举成员    } 基础类型必须能够表示该枚举中定义的所有枚举数值.枚举声明可以显式地声明 byte.sbyte.short.ushort.int.uint.long 或 ulong 类型作为对应的基础类型.没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int. (2)枚举成员枚举成员是该枚举类型的命名常数

  • Swift教程之枚举类型详解

    枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们. 如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值.在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值.如果一个值(被称为"原始"的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值. 另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体.你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组

  • .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显示,一个简单的枚举定义: public enum EnumGender { None, [System.ComponentModel.Description("男")] Male, [System.ComponentModel.Description("女")] Fem

随机推荐