博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
阅读量:5213 次
发布时间:2019-06-14

本文共 3200 字,大约阅读时间需要 10 分钟。

建议110:用类来代替enum

枚举(enum)用来表示一组固定的值。例如,为了表示星期信息,我们可以定义枚举Week:

enum Week    {        Monday,        Tuesday,        Wednesday,        Thursday,        Friday,        Saturday,        Sunday    }

枚举最大的优点在于它的类型是值类型。相比较引用类型来说,它可以在关键算法中提升性能,因为它不需要创建在“堆”中。但是,如果不考虑这方面的因素,我们不妨让类(引用类型)来代替枚举。代码如下:

class Week        {            public static readonly Week Monday = new Week(0);            public static readonly Week Tuesday = new Week(1);            //省略            private int _infoType;            private Week(int infoType)            {                _infoType = infoType;            }        }

我们将类型Week的构造方法实现为private,这有效阻止了类型在外部生成类的实例,使它的行为更接近于枚举。

类Week相比枚举Week的优点在于,它能够添加方法或重写基类方法,以便提供丰富的功能。以星期为例,如果要提供更有意义的字符串,如指定Monday是星期一,对于枚举来说,这并不是天然支持的。甚至会大费周折。曾经有人实现过枚举的这种功能:

enum Week    {        [EnumDescription("星期一")]        Monday,        [EnumDescription("星期二")]        Tuesday    }    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]    public sealed class EnumDescriptionAttribute : Attribute    {        private string description;        public string Description        {            get { return this.description; }        }        public EnumDescriptionAttribute(string description)            : base()        {            this.description = description;        }    }    public static class EnumHelper    {        public static string GetDescription(Enum value)        {            if (value == null)            {                throw new ArgumentNullException("value");            }            string description = value.ToString();            FieldInfo fieldInfo = value.GetType().GetField(description);            EnumDescriptionAttribute[] attributes = (EnumDescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);            if (attributes != null && attributes.Length > 0)            {                description = attributes[0].Description;            }            return description;        }    }        static void Main(string[] args)        {            Console.WriteLine(EnumHelper.GetDescription(Week.Monday));        }

输出:

星期一

 

如果不为枚举元素加上属性EnumDescription特性,我们只能使用:

Console.WriteLine(EnumHelper.GetDescription(Week.Monday));

输出:

Monday

如果在类中,就不会有枚举的这种不方便了,因为可以通过重写object的ToString方法将问题解决。代码如下:

static void Main(string[] args)        {            Console.WriteLine(Week.Monday);        }        class Week        {            public static readonly Week Monday = new Week(0);            public static readonly Week Tuesday = new Week(1);            //省略            private int _infoType;            private Week(int infoType)            {                _infoType = infoType;            }            public override string ToString()            {                switch (_infoType)                {                    case 0:                        return "星期一";                    case 1:                        return "星期二";                    default:                        throw new Exception("不正确的星期信息!");                }            }        }

相比枚举而言,类能赋予类型更多的行为。当然,如果应用场合满足如下特性,我们就应该更多的考虑使用枚举:

  • 效率。这源于枚举是值类型。
  • 类型用于内部,不需要增加更多的行为属性。
  • 类型元素不需要提供附加的特性。

 

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

转载于:https://www.cnblogs.com/jesselzj/p/4748503.html

你可能感兴趣的文章
http请求协议
查看>>
http响应消息
查看>>
VI快捷键速记
查看>>
Anaconda 改为国内镜像的方法
查看>>
Python访问Mysql
查看>>
Linux上安装Python3
查看>>
Nginx开启访问日志记录
查看>>
Python做域用户验证登录
查看>>
Linux上安装Mysql
查看>>
phpmailer【PHP邮件】的用法
查看>>
Lucene入门简介
查看>>
c# 获取键盘的输入
查看>>
svn diff 详解
查看>>
HDU 1548 A strange lift(简单BFS)
查看>>
Ubuntu下gcc安装及使用
查看>>
最短路算法 (bellman-Ford算法)
查看>>
Ubuntu 16.04安装Kate文本编辑工具
查看>>
活着与生存
查看>>
迅雷极速版|xunlei下载
查看>>
asp.net 权限问题
查看>>