C#枚举(enum)、常量(const)和readonly
const修饰的是(类)静态常量,,其值是在编译期间确定的readonly修饰的是动态常量。
A、C#中的const和readonly的区别
C#中定义常量有两种方式,一种叫做静态常量,使用“const”关键字定义(即const = static const),const定义的值是在编译期间确定的,只能在声明时通过常量表达式指定其值。另一种叫做动态常量,用“readonly”关键字来定义。两者区别如下:
1. const只能修饰基元类型、枚举类型或字符串类型,即限制const类型必须属于值类型范围,且其值不能通过new来进行设置,readonly没有限制;
2. const可用于修饰class的field或者一个局部变量(local variable);而readonly仅仅用于修饰class的field;
3. const常量属于类级别而不是实例对象级别,readonly常量既可以是类级别也可以是实例对象级别的;
4. const常量的效率更高并且不占用内存空间。const常量经过编译器编译后,在代码中引用const变量的地方会用const变量所对应的实际值来代替。而readonly常量需要系统为其所定义的常量分配空间。
B、C#枚举和常量的应用区别浅析,原文地址:http://developer.51cto.com/art/200908/144474.htm
C# 枚举和常量应用区别是什么呢?
当我们需要定义的时候呢,优先考虑枚举。
在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。这表示可以对它们调用方法,执行有用的任务。注意因为.NET Framework的执行方式,在语法上把枚举当做结构是不会有性能损失的。实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。
但是在实际应用中,你也许会发现,我们经常用英语定义枚举类型,因为开发工具本来就是英文开发的,美国人用起来,就直接能够明白枚举类型的含义。其实,我们在开发的时候就多了一步操作,需要对枚举类型进行翻译。没办法,谁让编程语言是英语写的,如果是汉语写的,那我们也就不用翻译了,用起枚举变得很方便了。举个简单的例子,TimeOfDay.Morning一看到Morning,美国人就知道是上午,但是对于中国的使用者来说,可能有很多人就看不懂,这就需要我们进行翻译、解释,就向上面的getTimeOfDay()的方法,其实就是做了翻译工作。所以,在使用枚举的时候,感觉到并不是很方便,有的时候我们还是比较乐意创建常量,然后在类中,声明一个集合来容纳常量和其意义。
C# 枚举和常量之使用常量定义:这种方法固然可行,但是不能保证传入的参数day就是实际限定的。
- using System;
- using System.Collections.Generic;
- //C# 枚举和常量应用区别
- public class TimesOfDay
- {
- public const int Morning = 0;
- public const int Afternoon = 1;
- public const int Evening = 2;
- public static Dictionary﹤int, string﹥ list;
- /// ﹤summary﹥
- /// 获得星期几
- /// ﹤/summary﹥
- /// ﹤param name="day"﹥﹤/param﹥
- /// ﹤returns﹥﹤/returns﹥
- public static string getTimeNameOfDay(int time)
- {
- if (list == null || list.Count ﹤= 0)
- {
- list = new Dictionary﹤int, string﹥();
- list.Add(Morning, "上午");
- list.Add(Afternoon, "下午");
- list.Add(Evening, "晚上");
- }
- return list[time];
- }
- }
希望能够找到一种比较好的方法,将枚举转为我们想要的集合。搜寻了半天终于找到了一些线索。通过反射,得到针对某一枚举类型的描述。
C# 枚举和常量应用区别之枚举的定义中加入描述
- using System;
- using System.ComponentModel;
- //C# 枚举和常量应用区别
- public enum TimeOfDay
- {
- [Description("上午")]
- Moning,
- [Description("下午")]
- Afternoon,
- [Description("晚上")]
- Evening,
- };
C# 枚举和常量应用区别之获得值和表述的键值对
- /// ﹤summary﹥
- /// 从枚举类型和它的特性读出并返回一个键值对
- /// ﹤/summary﹥
- /// ﹤param name="enumType"﹥
- Type,该参数的格式为typeof(需要读的枚举类型)
- ﹤/param﹥
- /// ﹤returns﹥键值对﹤/returns﹥
- public static NameValueCollection
- GetNVCFromEnumValue(Type enumType)
- {
- NameValueCollection nvc = new NameValueCollection();
- Type typeDescription = typeof(DescriptionAttribute);
- System.Reflection.FieldInfo[]
- fields = enumType.GetFields();
- string strText = string.Empty;
- string strValue = string.Empty;
- foreach (FieldInfo field in fields)
- {
- if (field.FieldType.IsEnum)
- {
- strValue = ((int)enumType.InvokeMember(
- field.Name, BindingFlags.GetField, null,
- null, null)).ToString();
- object[] arr = field.GetCustomAttributes(
- typeDescription, true);
- if (arr.Length ﹥ 0)
- {
- DescriptionAttribute aa =
- (DescriptionAttribute)arr[0];
- strText = aa.Description;
- }
- else
- {
- strText = field.Name;
- }
- nvc.Add(strText, strValue);
- }
- } //C# 枚举和常量应用区别
- return nvc;
- }
当然,枚举定义的也可以是中文,很简单的解决的上面的问题,但是,我们的代码看起来就不是统一的语言了。
- ChineseEnum
- public enum TimeOfDay
- {
- 上午,
- 下午,
- 晚上,
- }
C、C#获取枚举的键名称、值和描述,遍历枚举
C# Enum 枚举的操作。 键名称,值 和描述 和 遍历枚举
/// <summary>
/// 促销
/// </summary>
public enum cxsd
{
[Description("推荐")]
tj = 2,
[Description("置顶")]
zd = 4,
[Description("热卖")]
rm = 8
}
//获取 枚举 值
Array rolearry = Enum.GetValues(typeof(cxsd));
//获取枚举名称
String[]rolearry = Enum.GetNames(typeof(cxsd));
获取枚举描述
descriptions(cxsd.rm);//调用
public static string description(Enum en)
{
Type type = en.GetType();
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((DescriptionAttribute)attrs[0]).Description;
}
return en.ToString();
}
//遍历枚举
Type type = typeof(cxsd);
foreach (FieldInfo x in type.GetFields(BindingFlags.Public | BindingFlags.Static))
{
cxsd item = (cxsd)x.GetValue(null);
}
//通过以上方法 扩展一个 通用方法 。来获取 指定值的 描述信息
//调用方法
List<int> vlist=new List<int>();
vlist.add(4);
vlist.add(8);
descriptions<cxsd>(vlist);
/// <summary>
/// 获取描述信息
/// </summary>
/// <param name="envalue">枚举值的集合</param>
/// <returns>枚举值对应的描述集合</returns>
public static List<String> descriptions<T>(List<int> envalue)
{
Type type = typeof(T);
List<String> deslist = new List<String>();
foreach (FieldInfo x in type.GetFields(BindingFlags.Public | BindingFlags.Static))
{
T item = (T)x.GetValue(null);
if (envalue.Find((int e) => { return e == Convert.ToInt32(item); }) > 0)
{
deslist.Add(description<T>(item));
}
}
return deslist;
}
public static string description<T>(T en)
{
Type type = en.GetType();
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((DescriptionAttribute)attrs[0]).Description;
}
return en.ToString();
}
C#枚举(enum)、常量(const)和readonly的更多相关文章
- const与readonly常量
const与readonly常量 const与readonly都是用来定义常量,但是它们有什么区别呢? 下面我们来简要的说明一下: const修饰的常量是编译时常量,如:public const St ...
- 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const
C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...
- 枚举Enum和常量0之间的恩怨
1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...
- const,readonly 常量与只读
Const是常量 Const在编译时会被编译为静态成员,它确定于编译时期,属类型级,通过类型来访问. 现在通过以下几种情况来说明const常量: (1)初始化 public const string ...
- c#基础--常量(const),只读字段(readonly)
1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string n ...
- 常量(const)和只读变量(readonly)
//const修饰的数据叫做 常量 //常量一旦声明常量的值就不能改变. //常量在声明的时候 必须要赋初始值 //C#编译器在编译的时候 声明常量的那句话不见了. //在使用常量的地方就用常量的值代 ...
- 《C#高效编程》读书笔记02-用运行时常量(readonly)而不是编译期常量(const)
C#有两种类型的常量:编译期常量和运行时常量.两者有截然不同的行为,使用不当的话,会造成性能问题,如果没法确定,则使用慢点,但能保证正确的运行时常量. 运行时常量使用readonly关键字声明,编译期 ...
- const和readonly差别
我们都知道,const和static readonly的确非常像:通过类名而不是对象名进行訪问,在程序中仅仅读等等.在多数情况下能够混用.二者本质的差别在于,const的值是在编译期间确定的,因此仅仅 ...
- 【C#基础概念】枚举 (enum详解)
我们重点来讲解 简单枚举和标志枚举的用法和区别 继承 Object-> ValueType ->Enum Object-> ValueType ->struct 包括int f ...
- C#基础知识七之const和readonly关键字
前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...
随机推荐
- [置顶]
AI大行其道,你准备好了吗?—谨送给徘徊于转行AI的程序员
前言 近年来,随着 Google 的 AlphaGo 打败韩国围棋棋手李世乭之后,机器学习尤其是深度学习的热潮席卷了整个IT界.所有的互联网公司,尤其是 Google 微软,百度,腾讯等巨头,无不在布 ...
- SpreadJS 在 Angular2 中支持哪些事件?
SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎.排序.过滤.输入控件.数据可视化.Excel 导入/导出等功能,适用于 .N ...
- GitHub原来也可以用SVN客户端的.
不知道是不是自己真的太宅了. 一直以为只能用git client 来clone github工程的. 偶然今日发现还可以用 SVN 来下载的. 果断一试. 太好用了. 这回windows 上不用纠结 ...
- Java内存模型的深入理解
基础 并发编程的模型分类 在并发编程需要处理的两个关键问题是:线程之间如何通信 和 线程之间如何同步. 通信 通信 是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存 ...
- 【剑指offer】数组中的逆序对。C++实现
原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...
- 博通BCM53101M以太网交换芯片原理解析
Quality of Service 服务质量 BCM53101M的QoS为每个端口提供6个内部队列以支持6种不同的流量类别(traffic class, TC).在流量拥塞的情况下,可通过拥塞管理, ...
- 【paper】KDD15 - Interpreting Advertiser Intent in Sponsored Search
Interpreting Advertiser Intent in Sponsored Search 主要内容是搜索广告的相关性预估模型,使用learning to rank的方法.亮点在于使用了 ...
- Windows2008操作系统 IIS7 IIS7.5 进程池经常死最终解决方案
作为一个服务器维护人员,经常遇到不可解决的问题,这问题一直存在,一直困扰我多时,经常凌晨1-2点起床,就为了重启一下进程池 错误应用程序名称: w3wp.exe,版本: 7.5.7600.16385, ...
- maven报错【Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of】
[自己的操作] (1)windows -> Preferences -> maven 的settings.xml文件中.m2的位置已经失效,更改正确后尝试 (2)pom.xml还有下面错误 ...
- ssm+PageHelper实现分页查询
通过搭建ssm框架,然后通过mybatis的分页插件pagehelp进行分页查询.源码:https://gitee.com/smfx1314/pagehelper 看一下项目结构: 首先创建一个mav ...