C# 枚举和常量应用区别浅析

开发 后端
C# 枚举和常量应用区别是什么呢?C# 枚举和常量应用起来有什么实际区别呢?那么本文就向你介绍这方面的内容。

C# 枚举和常量应用区别是什么呢?

当我们需要定义的时候呢,优先考虑枚举。

在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。这表示可以对它们调用方法,执行有用的任务。注意因为.NET Framework的执行方式,在语法上把枚举当做结构是不会有性能损失的。实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。

但是在实际应用中,你也许会发现,我们经常用英语定义枚举类型,因为开发工具本来就是英文开发的,美国人用起来,就直接能够明白枚举类型的含义。其实,我们在开发的时候就多了一步操作,需要对枚举类型进行翻译。没办法,谁让编程语言是英语写的,如果是汉语写的,那我们也就不用翻译了,用起枚举变得很方便了。举个简单的例子,TimeOfDay.Morning一看到Morning,美国人就知道是上午,但是对于中国的使用者来说,可能有很多人就看不懂,这就需要我们进行翻译、解释,就向上面的getTimeOfDay()的方法,其实就是做了翻译工作。所以,在使用枚举的时候,感觉到并不是很方便,有的时候我们还是比较乐意创建常量,然后在类中,声明一个集合来容纳常量和其意义。

C# 枚举和常量之使用常量定义:这种方法固然可行,但是不能保证传入的参数day就是实际限定的。

  1. using System;  
  2. using System.Collections.Generic;  
  3.  //C# 枚举和常量应用区别
  4. public class TimesOfDay  
  5. {  
  6. public const int Morning = 0;  
  7. public const int Afternoon = 1;  
  8. public const int Evening = 2;  
  9. public static Dictionary﹤intstring﹥ list;  
  10. /// ﹤summary﹥  
  11. /// 获得星期几  
  12. /// ﹤/summary﹥  
  13. /// ﹤param name="day"﹥﹤/param﹥  
  14. /// ﹤returns﹥﹤/returns﹥  
  15. public static string getTimeNameOfDay(int time)  
  16. {  
  17. if (list == null || list.Count ﹤= 0)  
  18. {  
  19. list = new Dictionary﹤intstring﹥();  
  20. list.Add(Morning, "上午");  
  21. list.Add(Afternoon, "下午");  
  22. list.Add(Evening, "晚上");  
  23. }  
  24.  
  25. return list[time];  
  26. }  

希望能够找到一种比较好的方法,将枚举转为我们想要的集合。搜寻了半天终于找到了一些线索。通过反射,得到针对某一枚举类型的描述。

C# 枚举和常量应用区别之枚举的定义中加入描述

  1. using System;  
  2. using System.ComponentModel;  
  3.  //C# 枚举和常量应用区别
  4. public enum TimeOfDay  
  5. {  
  6. [Description("上午")]  
  7. Moning,  
  8. [Description("下午")]  
  9. Afternoon,  
  10. [Description("晚上")]  
  11. Evening,  
  12. }; 

C# 枚举和常量应用区别之获得值和表述的键值对

  1. /// ﹤summary﹥  
  2. /// 从枚举类型和它的特性读出并返回一个键值对  
  3. /// ﹤/summary﹥  
  4. /// ﹤param name="enumType"﹥  
  5. Type,该参数的格式为typeof(需要读的枚举类型)  
  6. ﹤/param﹥  
  7. /// ﹤returns﹥键值对﹤/returns﹥  
  8. public static NameValueCollection   
  9. GetNVCFromEnumValue(Type enumType)  
  10. {  
  11. NameValueCollection nvc = new NameValueCollection();  
  12. Type typeDescription = typeof(DescriptionAttribute);  
  13. System.Reflection.FieldInfo[]   
  14. fields = enumType.GetFields();  
  15. string strText = string.Empty;  
  16. string strValue = string.Empty;  
  17. foreach (FieldInfo field in fields)  
  18. {  
  19. if (field.FieldType.IsEnum)  
  20. {  
  21. strValue = ((int)enumType.InvokeMember(  
  22. field.Name, BindingFlags.GetField, null,   
  23. nullnull)).ToString();  
  24. object[] arr = field.GetCustomAttributes(  
  25. typeDescription, true);  
  26. if (arr.Length ﹥ 0)  
  27. {  
  28. DescriptionAttribute aa =   
  29. (DescriptionAttribute)arr[0];  
  30. strText = aa.Description;  
  31. }  
  32. else 
  33. {  
  34. strText = field.Name;  
  35. }  
  36. nvc.Add(strText, strValue);  
  37. }  
  38. }  //C# 枚举和常量应用区别
  39. return nvc;  

当然,枚举定义的也可以是中文,很简单的解决的上面的问题,但是,我们的代码看起来就不是统一的语言了。

  1. ChineseEnum  
  2. public enum TimeOfDay  
  3. {  
  4. 上午,  
  5. 下午,  
  6. 晚上,  

C# 枚举和常量应用区别的基本情况就向你介绍到这里,希望对你了解和学习C# 枚举有所帮助。

【编辑推荐】

  1. C# listview进度条显示浅析
  2. C# 进度条效果实现实例
  3. C# 枚举简介及优点浅析
  4. C# 枚举实例应用浅析
  5. C# 枚举常用方法浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-18 10:35:46

C#枚举类型

2009-08-17 17:49:20

C# 枚举

2009-08-18 10:30:30

C#枚举

2009-08-18 09:51:18

C#枚举类型

2009-08-18 12:52:33

C#枚举类型

2009-08-17 17:56:32

C# 枚举

2009-08-17 17:36:08

C# 枚举

2009-08-18 09:37:14

C#枚举类型

2009-08-18 13:00:59

C#枚举类型

2021-08-04 08:33:59

TypeScriptConst Readonly

2009-08-18 10:41:38

C#枚举类型

2009-08-13 14:06:37

C#结构体结构体和类的区别

2009-09-07 04:19:56

C#窗体事件

2009-08-07 08:53:52

C# ICloneab

2009-08-21 11:31:59

异步和多线程的区别

2009-08-27 14:12:02

C# interfac

2009-08-19 10:41:14

C# switch和c

2009-08-27 13:50:08

C# StringBu

2009-08-24 15:12:13

C# 泛型接口

2009-08-13 17:30:30

C#构造函数
点赞
收藏

51CTO技术栈公众号