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

这篇具有很好参考价值的文章主要介绍了C#,入门教程(66)——枚举Enum的高等用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#,入门教程(66)——枚举Enum的高等用法,C#入门教程 Beginner‘s Recipes,c#,算法,入门,数学,入门教程

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

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();
        }
    }
}

运行结果:

C#,入门教程(66)——枚举Enum的高等用法,C#入门教程 Beginner‘s Recipes,c#,算法,入门,数学,入门教程

可以把 枚举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类,这是一个密封的类,不能被修改或扩展。文章来源地址https://www.toymoban.com/news/detail-797962.html

到了这里,关于C#,入门教程(66)——枚举Enum的高等用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#入门教程

    一、C#的发展历史 C#是.net开发平台支持的多种语言中的一门编程语言。是Microsoft专门为.net 平台开发的一种新的编程语言,语法类似于C语言。 1998年,Delphi设计的第一个C#语言版本 2002年,发布了第一个C#版本(1.0) 二、C#能干什么 1.Windows窗口应用程序。Microsoft office,Windows外观应

    2024年02月04日
    浏览(77)
  • C#(CSharp)入门教程

    目录 C#的第一个程序 变量  折叠代码  变量类型和声明变量  获取变量类型所占内存空间(sizeof)  常量  转义字符  隐式转换  显示转换  异常捕获  运算符  算术运算符  布尔逻辑运算符 关系运算符  位运算符  其他运算符  字符串拼接  条件分支语句  if...else 语句

    2024年02月02日
    浏览(44)
  • Python入门教程+项目实战-14.1节-函数的参数用法

    目录 14.2.1 位置参数与参数 14.2.2 函数的参数默认值 14.2.3 函数的引用类型参数 14.2.4 函数的可变参数 14.2.5 知识要点 14.2.6 系统学习python 位置参数与参数的位置相关,这里的位置是指定义函数时的从左到右的参数排列顺序。在调用函数时,会自动将实参与形参的位置对

    2024年02月11日
    浏览(56)
  • Unity快速入门教程-创建并启用c#脚本

    提示:本篇文章主要提供新手入门学习,初次发文,多多指教 unity通过c#脚本构建项目逻辑关系,本篇介绍c#脚本创建,启用及其简单示例 提示:以下是本篇文章正文内容,下面案例可供参考 在Project窗口依次单击右键–Create–C#Script,创建脚本,假设命名为【Test】。

    2024年02月11日
    浏览(49)
  • C#,入门教程(15)——类(class)的基础知识

    上一篇: C#,入门教程(14)——字符串与其他数据类型的转换 https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚,凡物必类。 类的使用,须遵循几个简单的原则: (1)能类则类,留有余地。 (2)凡数据体及其集合,必写为类; (3)凡类,必独立文件; 类class实际上可

    2024年01月20日
    浏览(44)
  • C#,入门教程(20)——列表(List)的基础知识

    上一篇: C#,入门教程(19)——循环语句(for,while,foreach)的基础知识 https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表,区别于数据数组(array)。 List比数组提供强大得多!多!多!多!的功能,能存储更多!多!多!类型的数据(泛型)! List是更

    2024年01月16日
    浏览(54)
  • C# 正则表达式30分钟入门教程到放弃

    最近用到了C#的Regex类,所以又复习了一遍C#的正则表达式,发现还是和其他语言或者说以前的学习有很多不同以及提高之处,所以写这篇文章,用来给后来人一个系统性的教程或者引导。 字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行

    2024年02月15日
    浏览(45)
  • c#入门教程(有一定计算机基础的人看)

    废话不说,有一定基础的人看,如java等程序员 开发语言,为什么要学?主流游戏是用这个开发 c#微软做的,微软做了个.net framework,c#运行在这个之上。windows自带.net framework,但太辣鸡了,只支持windows,效果不好,就没更了,然后微软出了个新的 .net core ,支持linux,windows,m

    2024年02月04日
    浏览(104)
  • C#,入门教程(07)——软件项目的源文件与目录结构

    上一篇: C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具 https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后, Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工作就是在这个目录及这些文件的基础上进行的。 本文对这些目

    2024年01月19日
    浏览(49)
  • C#,入门教程(24)——类索引器(this)的基础知识

    上一篇:   C#,入门教程(23)——数据类型转换的一点基础知识 https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者,我们对语言重载的需求是:“ 不可或缺 ”。 没有重载几乎就无法开展大规模的工业软件编程项目

    2024年01月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包