C#中的readonly和const两个关键字都可以用来定义系统变量,那两者之间有什么区别呢?

1. const变量赋值后,就不可以对其进行修改。且在定义时就需要给它赋值,使用const修饰的变量是static的。可以使用YourClass.ConstantName的方式进行访问;

2. readonly变量可以在定义时赋值,也可以在构造方法中赋值或者修改定义时赋给的初始值;

另外还有一个细微的差别。看下面的场景,我在AssemblyA中定义了一个类如下:

    public class Readonly_VS_Const{public const int I_Const_Value = 100;public readonly int I_Readonly_Value = 20;public Readonly_VS_Const(){I_Readonly_Value = 55;}}

在AssemblyB中引用了AssemblyA,并且使用了这些常量,

    static void Main(string[] args){int constValue = Readonly_VS_Const.I_Const_Value;Readonly_VS_Const vs = new Readonly_VS_Const();int readonlyValue = vs.I_Readonly_Value;Console.WriteLine("Const Value:{0}--Readonly Value:{1}", constValue, readonlyValue);Console.ReadKey();}

查看一下IL代码,

注意查看使用黄色和绿色框标记的两行代码。

假设AssemblyA和AssemblyB编译完成后均放在AssemblyB的目录下

1. const变量类似与一种替换的方式,直接将定义的100写入到IL代码中。当我修改了I_Const_Value的值为200后,AssemblyB需要在程序重新编译后才能获得更新后的数值;

2. readonly的变量值,很像ref类型,readonly值不会直接写入到AssemblyB的IL代码中,这就意味者如果AssemblyA中readonly的值被修改后,你只需要重新编译一下AssemblyA即可。AssemblyB在调用时会找到根据变量的内存位置读取修改后的值。

static readonly vs const,

onst和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。
二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。

请看下面的例子:

    class Program{static readonly int A = B * 10;static readonly int B = 10;static void Main(string[] args){Console.WriteLine("A: {0} B: {1}", A, B);}}

结果如下:

将static readonly修改为const,

    class Program{const int A = B * 10;const int B = 10;static void Main(string[] args){Console.WriteLine("A: {0} B: {1}", A, B);}}

结果如下:

那么为什么是这样的呢?const是静态常量,所以在编译的时候就将A与B的值确定下来了(即B变量时10,而A=B*10=10*10=100),那么Main函数中的输出当然是A is 100,B is 10啦。而static readonly则是动态常量,变量的值在编译期间不予以解析,所以开始都是默认值,像A与B都是int类型,故都是0。而在程序执行到A=B*10;所以A=0*10=0,程序接着执行到B=10这句时候,才会真正的B的初值10赋给B。

感谢您的阅读!

转载于:https://www.cnblogs.com/yang-fei/p/7401854.html

[C#] readonly vs const相关推荐

  1. readonly和const的区别

    readonly与const的区别 1.const常量在声明的同时必须赋值,readonly在声明时可以不赋值 2.readonly只能在声明时或在构造方法中赋值(readonly的成员变量可以根据调 ...

  2. C# static readonly 与 const 的区别

    static readonly 与 const 的区别: const 表达式的值是在编译时形成的: static readonly 表达式的值直到程序运行时才形成: 转载于:https://www.c ...

  3. Readonly 与Const

    Readonly 与Const readonly 关键字是可以在字段上使用的修饰符.当字段声明包括 readonly修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中 ...

  4. readonly和const比较

    readonly和const比较 前天犯了个低级错误,是关于readonly的,总结了一下: C#的readonly关键字只能在字段上面使用 public readonly TcpClient cli ...

  5. C#中的static、readonly与const的比较

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理     readonly为运行时常量,程序运 ...

  6. readonly 与 const 区别

    今天遇到一道面试题,const和readonly区别,我答得有些糊涂,在msdn上查找了下,msdn解释如下: readonly 关键字与 const 关键字不同.const 字段只能在该字段的声明中 ...

  7. readonly 与 const

    readonly MSDN定义:readonly 关键字是可以在字段上使用的修饰符.当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数 ...

  8. C# Readonly和Const的区别

    什么是静态常量(Const)和动态常量(Readonly) 先解释下什么是静态常量(Const)以及什么是动态常量(Readonly). 静态常量(Const)是指编译器在编译时候会对常量进行解析,并 ...

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

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

  10. const和static readonly 区别

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

最新文章

  1. VisualStudio:WEB 性能测试和负载测试 入门
  2. 一起学并发编程 - sleep与wait的差异
  3. python 自动化-利用Python语言实现实验室自动化
  4. MySql中常用的内置函数
  5. 【Xmind】,让你的大脑解放出来
  6. java mvc增删改查_springmvc-CRUC增删改查
  7. 基本图形的光栅化算法
  8. 一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”
  9. [Noi2016]区间
  10. 赵明晒荣耀20青春版三色真机图:哪款会是你的菜?
  11. 2019 Multi-University Training Contest 2:Beauty Of Unimodal Sequence(DP + 贪心构造)
  12. 黑客入侵16进制密码_密码与密码黑客如何诱骗您入侵您的详细信息
  13. 不开方求两点距离的算法
  14. 问卷调查有哪些作用?
  15. 校园二手物品交易系统
  16. MYSQL 文件目录,数据库的存储文件目录
  17. No constructor found in com.think.pojo.Curd matching [java.lang.Long, java
  18. python单词库,标记单词
  19. 电力系统谐波影响及治理
  20. 2021-12-21 数据库系统原理复习提纲(一)

热门文章

  1. 开发好的项目必须要有好的需求
  2. 悟透JavaScript--可爱与智慧并存,灵感与诙谐共生
  3. Tensorflow:操作执行原理
  4. 有放回采样和无放回采样
  5. caffe 利用python绘制loss曲线以及accuracy曲线
  6. Pytorch基本操作
  7. python入门程序例子_Python 爬虫从入门到放弃(11 个有趣的 Python 爬虫例子)
  8. 计算机考试数据库相关知识点,计算机等级考试四级数据库工程师知识点总结
  9. react中dispatch_reactjs – TypeError:dispatch不是函数.在React无状态组件中
  10. Kotlin — 心印(熟悉与锻炼Kotlin语法)