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就是实际限定的。

  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﹤int, string﹥ 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﹤int, string﹥();
  20. list.Add(Morning, "上午");
  21. list.Add(Afternoon, "下午");
  22. list.Add(Evening, "晚上");
  23. }
  24. return list[time];
  25. }
  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. null, null)).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;
  40. }

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

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

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的更多相关文章

  1. const与readonly常量

    const与readonly常量 const与readonly都是用来定义常量,但是它们有什么区别呢? 下面我们来简要的说明一下: const修饰的常量是编译时常量,如:public const St ...

  2. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  3. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...

  4. const,readonly 常量与只读

    Const是常量 Const在编译时会被编译为静态成员,它确定于编译时期,属类型级,通过类型来访问. 现在通过以下几种情况来说明const常量: (1)初始化 public const string  ...

  5. c#基础--常量(const),只读字段(readonly)

    1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string n ...

  6. 常量(const)和只读变量(readonly)

    //const修饰的数据叫做 常量 //常量一旦声明常量的值就不能改变. //常量在声明的时候 必须要赋初始值 //C#编译器在编译的时候 声明常量的那句话不见了. //在使用常量的地方就用常量的值代 ...

  7. 《C#高效编程》读书笔记02-用运行时常量(readonly)而不是编译期常量(const)

    C#有两种类型的常量:编译期常量和运行时常量.两者有截然不同的行为,使用不当的话,会造成性能问题,如果没法确定,则使用慢点,但能保证正确的运行时常量. 运行时常量使用readonly关键字声明,编译期 ...

  8. const和readonly差别

    我们都知道,const和static readonly的确非常像:通过类名而不是对象名进行訪问,在程序中仅仅读等等.在多数情况下能够混用.二者本质的差别在于,const的值是在编译期间确定的,因此仅仅 ...

  9. 【C#基础概念】枚举 (enum详解)

    我们重点来讲解 简单枚举和标志枚举的用法和区别 继承 Object-> ValueType ->Enum Object-> ValueType ->struct 包括int f ...

  10. C#基础知识七之const和readonly关键字

    前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...

随机推荐

  1. MDN搜索结果自动跳转中文地址

    MDN社区(即Mozilla开发者社区)具有很多高质量中英文文档.它是我开发时遇到概念模糊的地方经常访问的网站.因为默认搜索一些代码,优先显示的都是英文.但是恰恰这些显示的英文文档是有中文的.每次都是 ...

  2. Android Studio3.0 新特性 ~ New Features in Android Studio Preview (译文)

    原文地址:https://developer.android.google.cn/studio/preview/features/index.html 最新Android Studio版本是Andro ...

  3. linux下升级svn版本到1.8

    CentOS6.5默认yum安装的svn版本为1.6,有时候遇到比较高级的应用就可能不够使用,这时候就需要升级一下svn的版本,可以升级到的版本为1.8 ====== 完美的分割线 ====== 1. ...

  4. Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  5. erl_0018 erlang_看门狗001_“内存大量占用检测及解决办法”

    绪:erlang出现问题百分之六七十在于内存问题,“进程消息队列爆炸”.“进程堆栈持续增长” 工具:erlang:memory(),erlang:system_info(process_count). ...

  6. “RPC好,还是RESTful好?”

    REST 和 RESTful 什么区别?REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful ...

  7. 修改 CentOS 中的 repo

    修改 CentOS 中的 repo 原因 由于安装 odoo 10 太慢,因为服务器是国外的. 修改 进入 repo 文件夹 cd /etc/yum.repos.d/ ls 可以看到所有的源.

  8. [LeetCode系列]最大容器问题

    给定n个数: a1, a2, ... , an. 代表着(i, ai)个点, 连接这些点与对应的(i, 0), 我们可以得到n条线. 请在这n条线中找出2条, 使得这两条线和x轴构成的容器能够容纳最多 ...

  9. 【转】电信100M光纤无线下载速度仅为5MB/秒的困惑

    原文网址:http://itbbs.pconline.com.cn/50463999.html 在江苏电信官方测速网站测速的.1.光猫F460有线连接至笔记本,下载速度为12MB/秒左右:2.F460 ...

  10. VirtulBox安装虚拟机(鼠标点击时)0x00000000指令引用的0x00000000内存该内存不能为written错误解决方案

    这个错误并不是所有人都会用到,我用的是WIN7系统,公司的电脑.查找了很多原因后,发现的确是由于系统主题被破解过的原因. 手工恢复风险太高.通过下面的工具就可以直接恢复.UniversalThemeP ...