前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >细说枚举.

细说枚举.

作者头像
喵叔
发布2022-05-06 18:26:30
6370
发布2022-05-06 18:26:30
举报
文章被收录于专栏:喵叔's 专栏

枚举是 C# 中最有意思的一部分,大部分开发人员只了解其中的一小部分,甚至网上绝大多数的教程也只讲解了枚举的一部分。那么,我将通过这篇文章向大家具体讲解一下枚举的知识。我将从大家都了解的部分开始讲解,然后再讲解大家所不知道的或者了解很少的部分。

零、基础知识

枚举是由开发人员声明的一种 值类型 ,它在编译时就声明了一种 具名常量值 。使用枚举可以使我们的代码简单易读,我们先来看一下两个代码段:

代码语言:javascript
复制
// 代码段 1
void Method(int country)
{
    switch (country)
    {
        case 0:
            // more code
            break;
        case 1:
            // more code
            break;
        case 2:
            // more code
            break;
        case 3:
            // more code
            break;
        default:
            // more code 
            break;
    }
}

// 代码段 2
void Method(Country country)
{
    switch (country)
    {
        case Country.CN:
            // more code
            break;
        case Country.JP:
            // more code
            break;
        case Country.UK:
            // more code
            break;
        case Country.USA:
            // more code
            break;
        default:
            // more code 
            break;
    }
}

从上面的两个代码段我们可以看到两者有明显的区别。第一段代码中的 case 值我们几乎完全不知道代表了什么是什么意思,但是第二段代码我们使用了枚举,通过 case 值马上就可以知道所要表达的意思。同样利用枚举值替代布尔值也可以改善代码的可读性,例如我们要开发控制台灯打开关闭的程序,代码可以这么写 LightOperating(True),但是这种代码我们无法看出具体要干什么,现在我们将代码改动一下 LightOperating(Light.On)。经过修改代码就很容易看出所要表达的意思。

一、枚举转换

枚举转换主要涉及到了枚举与枚举的转换、枚举与数字和字符串的转换。

枚举之间转换 首先我要说明的是在 C# 中不支持不同枚举数组之间的直接转换,所以如果想要实现不同枚举数组之间的转换我们可以利用 CLR 宽松的赋值兼容性这一特点来进行转换,需要转换的两个枚举必须具有相同的基础类型。同样,我们通过一个例子来看一下具体实现方法。 在使用这种方法时有可能会出现意外的错误或结果,并且相关开发规范中并没有说这种方式每次都起作用,因此我不建议这么使用,除非在一些极端场景中。

枚举和字符串之间转换 枚举转换为字符串可以直接使用 方法, 枚举值 ToString 后会直接输出枚举值标识符的字符串形式,例如 得到的结果是字符串 。当然,你也可以利用 和 方法来获取。下面我简单来讲解一下这两个方法的使用。

枚举和数字之间转换 枚举转换为数字我们可以使用强转,例如 返回结果是 0 。从数字转换为枚举我们有两种方法,一种是使用强转,另一种是使用 Enum 的静态方发 。

注意 字符串转换为枚举和数字转换为枚举都必须先进行判断所要转换的值是否包含在枚举中,判断的方法也很简单只需要调用 Enum 的静态方法 即可,例如我要将 0 和 HK 转换为枚举,代码如下: 上述代码中只有 0 会成功转换为枚举值 CN ,因为 0 所对应的枚举值是 CN ,而 HK 并没有在枚举中。

三、标志与属性

这一小节我们来讲解一下标志与属性,标志和属性属于在开发中用的比较少,并且大部分程序员了解的也不多。

标志 在开发中有时我们希望能对枚举进行组合使用来表示复合值,那么这时我们就需要定义标志枚举了,标志枚举的名称为复数形式,代表了一个标志的集合。一般我们会使用按位或操作符链接枚举值,使用 方法或者按位与操作符来判断特定的位是否存在。比较经典的标志枚举是位于 命名空间中的 标志枚举,它列出了文件的所有属性,比如只读、隐藏、所在磁盘等等,它所包含的所有枚举值皆可相互组合,例如一个文件既是隐藏文件又是只读文件。定义标志枚举的方法如下: 在上面的代码中你会发现一个规律,每个枚举值对应的整数值都是 2的n次方,这是为什么呢。在标志枚举中要求多个枚举值相互组合后的结果不能包含在标志枚举中,并且基于按位运算的特性可以很方便的使用位运算符来计算一个枚举值是否包含了另外一个枚举值,这在权限系统中相当有用。

属性 枚举值上同样也可以使用属性,例如我们需要打印输出枚举值的中文名,我们就可以通过属性的形式进行设置,首先我们需要定义一个属性: 通过上面的代码我们就能获取到 CN 对应的中文名称了,这段代码并没有进行进一步优化,在实际项目中必须进行封装和优化。

四、小结

这篇文章主要讲解了枚举相关的知识,内容有点琐碎,但是在实际开发中还是比较实用的。文章中我所提到的要点和规定在实际开发中已经经过验证,各位读者可以直接拿来使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、基础知识
  • 一、枚举转换
  • 三、标志与属性
  • 四、小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档