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…

嵌入式应用开发学习建议

学习嵌入式应用开发需要掌握一定的编程语言、操作系统和硬件知识&#xff0c;以下是一些学习嵌入式应用开发的建议: 1&#xff09;学习C/C等编程语言&#xff1a;C/C是嵌入式系统最常用的编程语言之一&#xff0c;掌握这些语言的语法和特性可以帮助开发人员更好地理解嵌入式系…

What is `HttpServletRequestWrapper` does?

HttpServletRequestWrapper 是 Java Servlet API 中的一个类&#xff0c;作为 HttpServletRequest 接口的包装器&#xff08;Decorator&#xff09;实现。 该类设计为装饰者模式&#xff08;Decorator Pattern&#xff09;的一部分&#xff0c;允许开发人员通过包装现有的 Http…

【DP】53.最大子数组和

题目 法1&#xff1a;DP class Solution {public int maxSubArray(int[] nums) {if (nums null || nums.length 0) {return 0;}int n nums.length, res nums[0];int[] dp new int[n];dp[0] nums[0];for (int i 1; i < nums.length; i) {dp[i] Math.max(nums[i], d…

Orchestrator源码解读4-计划内切换

计划内切换 Graceful master promotion 通常因为升级&#xff0c;服务器为何等原因&#xff0c;需要按照计划将主库迁移到其他实例的情况。 计划内切换的拓扑结构改变的流程如下&#xff1a; orchestrator自己选或用户自己指定一个从库实例为新主库orchestrator将其他从库ch…

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

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

【leetcode题解C++】707.设计链表

你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一个节点…

Git_01_push失败之解决办法

从本地服务器向云端服务器提交代码的过程中&#xff0c;碰到了以下问题&#xff1a; 提示账号没有push权限 rootlocalhost:~/repo/$ git push qnx HEAD:refs/for/develop Counting objects: 29, done. Delta compression using up to 32 threads. Compressing objects: 100% …

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

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

排序算法-冒泡排序(含C语言代码示例)

一、算法介绍 冒泡排序是一种简单的排序算法&#xff0c;其核心思想是重复地遍历待排序列表&#xff0c;比较并交换相邻元素&#xff0c;使得较大的元素逐渐“冒泡”到列表的末尾&#xff0c;而较小的元素则逐渐上浮至列表的前端。该算法的名字源于类比元素的移动过程&#xff…

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

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

vue使用el-input监听不了回车事件解决方法

无法监听回车事件 <el-input v-model"password" type"password" placeholder"密码" keyup.enter"onLogin"></el-input> 在keyup.enter后加上’.native’ <el-input v-model"password" type"password…

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

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

C语言实现双向循环链表

1.mj版本的双向循环链表(虚拟头节点) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define ELEMENT_NOT_FOUND -1 // 设置一个节点类 typedef struct Node {// 数据域int data;// 指针域struct Node* pre;struct Node* next; }Node; // 初…

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

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

Linux修改文件名的三种方法分享

在Linux系统中&#xff0c;修改文件名是日常工作中常见的操作之一。无论是批量重命名文件还是修改单个文件名&#xff0c;掌握合适的方法可以提高工作效率。本文将分享三种常用的Linux修改文件名的方法&#xff0c;帮助您轻松应对文件管理任务。 方法一&#xff1a;使用mv命令 …

面试百问: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 …

编程笔记 html5cssjs 039 CSS背景示例

编程笔记 html5&css&js 039 CSS背景示例 一、html二、css小结 网页上只有三个水平并列大小相同的的DIV&#xff0c;大小为300p*200,如何使用CSS让它们整体水平和垂直都居中&#xff0c;并使用不同的背景色&#xff1f; 一、html 要在网页上实现三个水平并列且大小相同…