C#常量主要分为两种:编译时和运行时常量

编译时常量用关键字const来定义,运行时常量用关键字readonly来定义

两者区别:

编译时常量,在编译时便用该常量的值代替常量变量。

运行时常量,在运行时返回一个运行时常量的变量引用

这两种变量引用方式会导致什么不同呢,且看下面代码:

引用Effective C#中的例子:定义一个类库Limitation,其中呢定义了一个类Limitations,代码如下:

public class Limitations
{
public static readonly int startValue =5;
public const int endValue=10;
}

该类中包含两个量,一个是编译时常量,一个是运行时常量

我在主程序中,引用该类库,并调用该类的相关值,代码如下:

static void Main(string[] args)
{
for (int i = Limitations.startValue; i < Limitations.endValue; i++)
{
Console.WriteLine(i.ToString());
}
Console.Read();
}

运行结果:

5

6

7

8

9

现在我更新一下程序集Limitation,代码如下:

public class Limitations
{
public static readonly int startValue =105;
public const int endValue=120 ;
}

生成一下,替换掉原来的程序集,运行结果是什么也没有

这是为什么呢?原来是跟两种变量的执行行为有关系,对于编译时常量,在编译时会用其值替换掉所有的编译时常量变量,当你更换程序集时,在引用的程序中,原来编译时常量的值不会改变,所以endValue仍为10;而对于运行时变量,因为在运行时保留的是运行时变量的引用,所以会用新的值代替掉原来的值,导致startValue的值为105.所以没有运行结果。

从上边的例子,我们可以看出两种变量的使用情况,如果要使程序有好的可维护性可以选择运行时变量。

对于编译时常量,由于在编译时就已经用值替换了变量,可以使程序在性能上有轻微的提高,所以如果程序很少有变动,则可以选择编译时常量。

转载于:https://www.cnblogs.com/ATually/archive/2010/12/23/1914587.html

C#常量——const和readonly相关推荐

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

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

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

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

  3. 20100422.C#.const VS readonly

    const和readonly这对"顽固"的兄弟着实会让我这样的菜鸟迷惑. 研究了一番算是有所感悟了. const常量在编译时就会确定值,编译器直接进行值replace,就像是C语言 ...

  4. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  5. 如何在 C# 中使用 const,readonly,static

    平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...

  6. const 和readonly

    原文:http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 关于 const和readonly修饰符之间的区别,要牵涉到C# ...

  7. C#中const和readonly的区别

    C#引入了readonly修饰符来表示只读域,const来表示不变常量.顾名思义对只读域不能进行写操作,不变常量不能被修改,这两者到底有什么区别呢?只读域只能在初始化--声明初始化或构造器初始化--的 ...

  8. C# const与readonly的用法和区别解析(转)

    总结一下const和readonly: 1.const和readonly的值一旦初始化则都不再可以改写: 2.const只能在声明时初始化:readonly既可以在声明时初始化也可以在构造器中初始化: ...

  9. [c#] const 与 readonly

    c# 中 const 与 readonly 关键字看似相同,实则不同.重点在于确定值的时间. const const 很简单,就是一个常量,不可以被 static 修饰,因为被 const 修饰的字段 ...

最新文章

  1. OpenWrite 公开内测,做最懂你的技术自媒体管理平台!
  2. 2020年python工资一般多少钱-2020年Python发展前景如何呢?
  3. 结构对齐--__packed与#pragma pack
  4. EasyUI中Dialog对话框的简单使用
  5. java:十进制转十六进制
  6. 思科IPS系统的bypass mode
  7. Sublime配置与各种插件
  8. Dinosaur Run - Dinosaur world Games
  9. 关于eclipase出现的problems during content assist报错问题
  10. angular cannot get /
  11. 浅析GDAL库C#版本支持中文路径问题(续)
  12. 识别图书ISBN号并输出查询结果的示例 | Marshal's Blog
  13. 20.go vet 和 go tool vet
  14. QCon北京2015精彩内容前瞻:运维、服务质量、云平台、移动、机器学习、编程语言...
  15. vue 表格固定首行首列(纯css)
  16. ST-Link v2 下载 出现target dll has been cancelled 的错误的解决方法
  17. linux中IGV的运行,科学网—使用UCSC和IGV查看reads在基因组上分布情况 - 熊朝亮的博文...
  18. imap服务器收缓存pst文件夹,Outlook 转移OST数据文件 IMAP账户
  19. 2021-5月13日-今日收获
  20. Vivo(IQOO)无法输出调试日志解决办法

热门文章

  1. onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!
  2. linux mint 17.3 内核,LinuxMint 17.3 Cinnamon抢鲜评测
  3. python中in的底层实现_python中print和input的底层实现
  4. 测试服务器最大链接数_LoaRunner性能测试系统学习教程:probe监控(3)
  5. everything文件搜索_本地文件搜索神器,Everything、Listary、AnyTXT Searcher!
  6. 军队可以用oracle,使用Oracle JRockit 提高tomcat性能
  7. oracle 9I 存储过程复制,使用ADO.NET访问Oracle 9i存储过程(上)_oracle
  8. python 删除文件-python 删除文件和读取文件
  9. annie安装教程与Access is denied解决方法
  10. 如何查看一个linux用户的口令保留策略