C#,入门教程(66)——枚举Enum的高等用法

前言:国内码农与国外优秀程序员的最大区别是,我们的专家、教授喜欢唾沫横飞地,夸夸其谈语言特性、框架、性能,唯一目的是带私货(书籍或教程),很少能写出真有用的程序。差距在哪呢?基础!基础!基础!

1 优缺点共存是所有语言、语法的常态

枚举enum是常用的数据类型,有很多优点。

枚举使用过程也有很多不便,比如:值、名字、描述的对应关系不便检索。

2 高级一点的使用方法

下面的代码具有较高的参考价值,建议仔细阅读。 

using System;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;/// <summary>
/// 便于使用的枚举
/// </summary>
namespace K50018.Kernal
{/// <summary>/// 一个枚举实例/// </summary>public static class EnumHelper{public enum EnumExample{[Description("号球")]CODE = 0,[Description("数字")]DIGITAL,[Description("红球")]RED_BALL,[Description("蓝球")]BLUE_BALL,[Description("前区")]FIRST_BALL,[Description("后区")]SECOND_BALL,}/// <summary>/// 按枚举变量提取枚举的描述(标题)/// </summary>/// <param name="cs">枚举值,比如:EnumExample.CODE</param>/// <returns></returns>public static string GetDescription(EnumExample cs){return GetEnumDescription(cs);}/// <summary>/// 按序号提取枚举的描述(标题)/// </summary>/// <param name="index">0开始的序号</param>/// <returns></returns>public static string GetDescription(int index){Array array = Enum.GetValues(typeof(EnumExample));if (index < 0 || index >= array.Length) return "";EnumExample cs = (EnumExample)array.GetValue(index);return GetDescription(cs);}/// <summary>/// 按枚举名字提取的描述(标题)/// </summary>/// <param name="name"></param>/// <returns></returns>public static string GetDescription(string name){string[] array = Enum.GetNames(typeof(EnumExample));for (int i = 0; i < array.Length; i++){if (array[i].ToUpper() == name.ToUpper()){return GetDescription(index: i);}}return "";}/// <summary>/// 提取标题的基础函数/// </summary>/// <param name="value"></param>/// <returns></returns>private static string GetEnumDescription(Enum value){FieldInfo fi = value.GetType().GetField(value.ToString());DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);return (attributes.Length > 0) ? attributes[0].Description : value.ToString();}/// <summary>/// 将枚举转为三元组列表/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static List<Tuple<int, string, string>> ToList<T>(){List<Tuple<int, string, string>> r = new List<Tuple<int, string, string>>();Array xa = Enum.GetValues(typeof(T));string[] na = Enum.GetNames(typeof(T));for (int i = 0; i < na.Length; i++){EnumExample cs = (EnumExample)xa.GetValue(i);r.Add(new Tuple<int, string, string>((int)cs, na[i], GetDescription(i)));}return r;}/// <summary>/// 另外一种按序号提取枚举描述的方法/// </summary>/// <typeparam name="T"></typeparam>/// <param name="index"></param>/// <returns></returns>public static string GetDescription<T>(int index){List<Tuple<int, string, string>> r = ToList<T>();return r[index].Item3;}/// <summary>/// 应用实例/// </summary>/// <returns></returns>public static string Drive(){StringBuilder sb = new StringBuilder();sb.AppendLine("1 按枚举变量提取描述");sb.AppendLine("EnumExample.CODE -> " + GetDescription(EnumExample.CODE));sb.AppendLine("2 按序号量提取描述");sb.AppendLine("EnumExample[3] -> " + GetDescription(3));sb.AppendLine("3 按枚举名提取描述(大小写无关)");sb.AppendLine("EnumExample[\"code\"] -> " + GetDescription("code"));sb.AppendLine("4 转换为三元组");int idx = 0;foreach (Tuple<int, string, string> tx in ToList<EnumExample>()){sb.Append(idx + ": ");sb.Append("value=" + tx.Item1.ToString() + " ");sb.Append("name=" + tx.Item2.ToString() + " ");sb.AppendLine("description=" + tx.Item3.ToString() + " ");idx++;}sb.AppendLine("5 按三元组的序号提取描述");sb.AppendLine("Tuple[3] -> " + GetDescription<EnumExample>(3));return sb.ToString();}}
}

运行结果:

可以把 枚举enum 当作 类class 来使用就方便多了。

3 未来

.NET 8 之后。

国家把大量的资金投入高校与研究所,等于肉包子打狗,

别指望他们能写出任何一个有用的软件。

如果你的枚举类型只是用来表示一些简单的常量,而且不需要进行复杂的操作或逻辑,那么你可以使用枚举,它更简单,更直观,更高效。但是,如果你的枚举类型需要包含一些额外的信息,或者需要提供一些特定的方法,或者需要实现一些接口,或者需要继承一些类,那么你可以使用枚举类 Enumeration ,它更灵活,更易于维护。

Enumeration类是一个抽象类,它实现了IComparable接口,有两个属性:Name和Id,分别表示枚举的名称和值。它的构造函数接受两个参数,用于初始化这两个属性。它重写了ToString方法,返回Name属性的值。它还重写了Equals和GetHashCode方法,用于判断两个枚举对象是否相等,以及计算枚举对象的哈希值。它还提供了以下几个静态方法:

GetAll<T>:返回一个包含所有枚举对象的数组,其中T是Enumeration的子类。
AbsoluteDifference(Enumeration firstValue, Enumeration secondValue):返回两个枚举对象的Id属性的绝对差值。
FromValue<T>(int value):根据value参数查找对应的枚举对象,如果不存在则抛出异常。
FromDisplayName<T>(string displayName):根据displayName参数查找对应的枚举对象,如果不存在则抛出异常。
Parse<T, K>(K value, string deion, Func<T, bool> predicate):根据value参数和predicate委托查找对应的枚举对象,如果不存在则抛出异常。这是一个私有方法,被FromValue<T>和FromDisplayName<T>方法调用。

Enumeration类的设计非常精巧,它提供了一种通用的方式来创建枚举类型,只需要继承它并定义一些静态字段即可。那么,这样的设计到底有哪些好处呢?其实,通过与枚举进行对比,就可以找到答案,我们来看一看它们的区别:枚举类可以包含更多的信息,而不仅仅是一个整数值。例如,OrderStatus类除了有Id属性外,还有Name属性,用于表示订单状态的名称。这样可以方便地在界面上显示订单状态,而不需要额外的转换逻辑。而枚举只能表示一个整数值,如果要显示名称,就需要使用switch语句或者字典来映射。
枚举类可以提供更多的方法,而不仅仅是一些基本的操作。例如,OrderStatus类提供了List,FromName,From等方法,用于获取所有的订单状态,或者根据名称或值查找订单状态。而枚举只能使用Enum类的一些静态方法,如Enum.GetValues,Enum.GetName,Enum.Parse等,这些方法的参数和返回值都是object类型,需要进行类型转换,而且容易出错。
枚举类可以实现接口,而枚举不能。例如,Enumeration类实现了IComparable接口,表示它可以进行比较。这样可以方便地对枚举对象进行排序,或者使用一些LINQ方法,如Min,Max,OrderBy等。而枚举不能实现接口,只能使用默认的比较规则,即按照整数值的大小比较。
枚举类可以继承其他类,而枚举不能。例如,OrderStatus类继承了Enumeration类,这样可以方便地复用Enumeration类的一些通用的方法和属性,而不需要重复编写代码。而枚举不能继承其他类,只能继承System.Enum类,这是一个密封的类,不能被修改或扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数——行列式相关性质

目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行&#xff08;列&#xff09;&#xff0c;行列式变号 三、行列式某行&#xff08;列&#xff09;有公因子k&#xff0c;则k可以提到行列式外 四、行列式中若两行成比例&#xff0c;则行列式为0 五、行列式的某一行…

Python | 三、函数

函数的形参和实参&#xff08;对应卡码网11题句子缩写&#xff09; 除非实参是可变对象&#xff0c;如列表、字典和集合&#xff0c;则此时形参会复制实参的地址&#xff0c;即此时二者指向同一个地址&#xff0c;因此在函数内对形参的操作会影响到实参除这种情况外&#xff0…

【江科大STM32合集】day2按键控制LED光敏传感器控制峰鸣器

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器 电路基础c语言基础main.ckey.c结果 实现一个键开关灯实验结果避坑 电路基础 运算放大器-在江科大51单片机b站视频&#xff08;AD/DA&#xff09;复习 原理&#xff1a;两个极端 同相输入端电压 》反相输入端 电压输出最…

如何利用小程序介绍公司品牌形象?

企业小程序的建设对于现代企业来说已经成为了一项必不可少的工作。随着移动互联网的快速发展&#xff0c;越来越多的职场人士和创业老板希望通过小程序来提升企业形象&#xff0c;增强与用户的互动&#xff0c;实现更好的商业效果。在这个过程中&#xff0c;使用第三方制作平台…

Java零基础教学文档第五篇:jQuery

今日新篇章 【jQuery】 【主要内容】 jQuery简介 jQuery安装 jQuery语法 jQuery选择器 jQuery事件处理 jQueryDOM操作 jQuery元素遍历 jQuery过滤 jQuery其它方法 【学习目标】 1.jQuery简介 1.1 jQuery简介 jQuery 库可以通过一行简单的标记被添加到网页中。 1.…

国内镜像:极速下载编译WebRTC源码(For Android/Linux/IOS)(二十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

Vue学习笔记5-- nextTick | Vue封装的过渡与动画

一、nextTick(tick-工作&#xff0c;起作用&#xff1b;下次起作用&#xff09; 语法&#xff1a; this.$nextTick(回调函数&#xff09;作用&#xff1a;在下一次DOM更新结束后执行其指定的回调。什么时候用&#xff1a;当改变数据后&#xff0c;要基于更新后的新DOM进行某些…

面试百问:Redis常见的故障以及发生场景

作为一个测试同学&#xff0c;被测系统架构中有使用到redis吗&#xff1f;对redis常见的故障有了解吗&#xff1f;又是如何进行测试的呢&#xff1f; 针对常见的redis面试问题&#xff0c;怎样才算一个高质量的回答呢&#xff0c;回答思路一般包括 问题的类型是什么&#xff…

快速入门Java NIO(Not I/O)的网络通信框架--Netty

Netty 入门 了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1. 概述 1.1 Netty 是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid …

Flink启动Yarn Session报错:Couldn‘t deploy Yarn session cluster

Flink版本&#xff1a;1.1.3 启动Yarn Session的语句&#xff1a;bin/yarn-session.sh -nm test -d 报错截图如下&#xff1a; 仅通过ERROR信息只能知道是yarn session集群未能正常启动&#xff0c;因此继续向下查找&#xff1a; 找到报错信息的Caused by部分&#xff1a; 报…

test-03-test case generate 测试用例生成 Randoop 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 Rand…

13 | 使用代理ip爬取安居客房源信息

这是一个简单的Python爬虫代码,用于从安居客网站爬取房地产信息。该爬虫使用了代理IP来绕过可能的封禁,并提供了一些基本的信息抽取功能。 如果访问过多,那么可能出现了验证码 对此,最好的方法就是换ip。 使用代理IP的主要目的是保护爬虫的稳定性和隐私。以下是一些常见的原…

Macbook空间不足怎么解决?

随着使用时间的增长&#xff0c;我们会发现Mac电脑的存储空间越来越少&#xff0c;这时候我们就需要对Mac电脑进行清理&#xff0c;以释放更多的存储空间。那么&#xff0c;Mac空间不足怎么解决呢&#xff1f; 1.清理垃圾文件 Mac空间不足怎么解决&#xff1f;首先要做的就是清…

若依基于sm-crypto实现前后端登录密码加密

上一节介绍了基于jsencrypt实现的密码加密解密登录功能&#xff0c;这次来介绍基于sm-crypto实现前后端登录密码加密&#xff0c;本次采用的是sm2进行的加密解密。 后端 首先从后端代码开始写起(因为公钥和私钥都是要从java代码中生成)&#xff1a; 首先需要引入sm-crypto的j…

vmware16安装centos9stream

此次下载的是centos9 stream &#xff0c;使用vmware16。因为centos9stream版本比较新&#xff0c;所以vmware16无法识别此系统&#xff0c;不过无伤大雅。但是可能会导致兼容性问题&#xff0c;比如开机关机会很慢&#xff0c;建议还是用vmware17&#xff01; 下载镜像文件&a…

投资自己,成就未来——社科院杜兰大学金融管理硕士项目

或许你一直在寻找一个能够提升自己、实现职业突破的机会。如果你对金融领域充满热情&#xff0c;并且渴望在这个竞争激烈的行业中脱颖而出&#xff0c;那么我要向你介绍一个绝佳的选择——中国社会科学院与美国杜兰大学金融管理硕士项目。 在这个高速发展的时代&#xff0c;投…

交通流量预测:T-GCN A Temporal Graph Convolutional Network for Traffic Prediction

摘要 为了同时捕捉时空相关性&#xff0c;将图卷积网络(GCN)和门控递归单元(GRU)相结合&#xff0c;提出了一种新的基于神经网络的流量预测方法–时态图卷积网络(T-GCN)模型。具体地&#xff0c;GCN用于学习复杂的拓扑结构以捕获空间相关性&#xff0c;而门控递归单元用于学习…

杨中科 EFCORE 第六部分 一对多关系配置

一对多关系配置 什么是实体间关系 1、所谓“关系数据库” 2、复习:数据库表之间的关系: 一对一、一对多、多对多。 3、EF Core不仅支持单实体操作&#xff0c;更支持多实体的关系操作。4、三部曲:实体类中关系属性;FluentAPI关系配置;使用关系操作。 一对多: 实体类 1、文章…

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

基于JavaWeb+BS架构+SpringBoot+Vue健美操评分系统系统的设计和实现

基于JavaWebBS架构SpringBootVue健美操评分系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目 录 1 绪 论 1 1.1背景与意义 1 1.2 国内外研究概况 1 1.3 研究的内容…