用户名: 密码: 免费注册 忘记密码? 加入收藏 | 设为首页
C#箴言:定义常量的两种方法
学院首页 | 资讯中心 | 服务器软件 | 系统工具 | 系统软件 | 办公软件 | 聊天软件 | 多 媒 体 | 网页制作 | 网站运营 | 平面设计
艺术欣赏 | 数据库软件 | 程序开发 | 网络组建 | 源码下载 | 驱动下载 | 软件下载 | 电脑安全 | IT创业 | IT博客 | IT社区
硬件数码导航 | 硬件频道 | 本本频道 | MP3频道 | 相机频道 | 手机频道 | 显卡频道 | LCD 频道 | 音箱音频 | 行情 | 评测 | 导购
学院专题 软件 - 系统 - 办公 - 聊天 - 多媒体 - 网页制作 - IT创业 - 运营 - 平面 - 设计欣赏 - 数据库 - 程序 - 服务器 - 组网

 当前位置: 首页>>技术频道>>程序>>c#教程>>正文

C#箴言:定义常量的两种方法

日期:2006-9-15 4:21:11     来源:aspcool   编辑:   

   在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant) 。 前者用“const”来定义,后者用“readonly”来定义 。

   对于静态常量(Compile-time constant),它的书写方式如下:

   public const int MAX_VALUE = 10;

   为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这里只是为了方便说明) 。

   public static const int MAX_VALUE = 10;

   用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误 。 此外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:

   int nValue = MAX_VALUE;

   这句在编译之后,和如下这句所产生的中间语言代码是一样的 。

   int nValue = 10;

   不过,在用const来定义常量的时候,在类型上有很多限制 。 首先,此类型必须属于值类型,同时此类型的初始化不能通过new来完成,因此一些用struct定义的值类型常量也不能用const来定义 。

   相对于const而言,用readonly来定义常量要灵活的多,它的书写方式如下:

   public readonly int MAX_VALUE = 10;

   为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类的其他成员一样拥有独立的空间 。 此外,readonly所定义的常量除了在定义的时候可以设定常量值外,还可以在类的构造函数中进行设定 。 由于readonly所定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的常量 。

   综合上面所述,至于对比两者之间的区别具体如下 。

静态常量(Compile-time constant) 动态常量(Runtime constant)
定义 声明的同时要设置常量值 。 声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置 。
类型限制 首先类型必须属于值类型范围,且其值不能通过new来进行设置 。 没有限制,可以用它定义任何类型的常量 。
对于类对象而言 对于所有类的对象而言,常量的值是一样的 。 对于类的不同对象而言,常量的值可以是不一样的 。
内存消耗 无 。 要分配内存,保存常量实体 。
综述 性能要略高,无内存开销,但是限制颇多,不灵活 。 灵活,方便,但是性能略低,且有内存开销 。

   对于在定义常量的时候,到底是用const来定义还是readonly来定义,我以前为了追求性能,因此尽量用const来定义 。 但是在此书中,提到了一个关于使用const会产生潜在的bug 。 就是在程序中使用DLL类库某个类的静态常量时,如果在类库中修改静态常量的值,其它接口没有发生变化,一般来说,程序调用端是不需要重新编译,直接执行就可以调用新的类库 。 不过就是在此情况下,会产生潜在的bug 。 这是由于静态常量在编译的时候,是用它的值去替换常量,因此在调用端的程序也是这样进行替换的 。

   例如:在类库中定义了一个静态常量,如下:

public const int MAX_VALUE = 10;

   那么对于程序中调用此静态常量这段代码,在编译后产生的中间语言代码中,是用10来进行替换,即使用静态常量的地方,改为10了 。

   那么当类库的静态变量发生变化后,例如:

public const int MAX_VALUE = 15;

   那么对于调用端程序是可以在没有重新编译的情况下进行运行,不过此时程序的中间语言代码对应于静态变量的值是10,而不是新类库中的15 。 因此这样产生的不一致,程序会引发潜在的bug 。 解决此类问题的方法,就是调用端程序在更新类库之后重新编译一下,即生成新的中间语言代码 。

   对于如上在const定义常量时所存在的潜在bug,在用readonly定义常量时是不会发生的 。 因为readonly定义的常量类似于类的成员,因此在访问的时候需要根据具体常量地址来访问,从而避免此类bug 。

   鉴于此,本书建议用readonly来替换const去定义常量 。
gigi_miao
  ▼ 下一篇新闻 C#中父窗口和子窗口之间实现控件互操作
  ▲ 上一篇新闻 Visual C# 2005快速入门之编写方法        网友发表观点请进入=>



我要纠错】【进入论坛交流】【关闭此页

文章搜索
   
最新文章

 
·千名爱好者参与首届PHP调查
·腾讯称QQ通讯信息密钥加密 不会被
·雅虎反超Google排名搜索第二
·中搜等十余家IT企业因流氓软件被
·盛大前员工克隆网游装备获暴利被
·凤凰网将向迅雷提供娱乐及宽带内
·信产部出手规范 新浪式企业法律架
·雅虎中国称旗下软件早已没有流氓
·中搜停止划词搜索与流氓软件决裂

广告赞助
相关文章 相关教程下载
焦点信息
·腾讯称QQ通讯信息密钥加密 不会被监听
·信产部出手规范 新浪式企业法律架构不得不改
·盛大前员工克隆网游装备获暴利被追刑责
·凤凰网将向迅雷提供娱乐及宽带内容
·雅虎中国称旗下软件早已没有流氓问题
·雅虎反超Google排名搜索第二
网友评论:(评论内容只代表网友观点,与本站立场无关!)
发表评论     Hard168社区推荐帖子
姓 名: *
* 请网友遵纪守法并注意语言文明。
IT人物推荐

王江民
马云
柳传志



关于本站    联络方式    广告服务    意见信箱    加入收藏   设为首页    -
本站部分内容来自网上,如有侵权部分,敬请告知,我们会在24小时内给予处理
版权所有:Hard168.Com,如需转载文章请与我们取得联系
京ICP备05063857号 Designed by Hard168.Com
C#箴言:定义常量的两种方法