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

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

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

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

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

在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 * ; static readonly int B = ; static void Main(string[] args)
{
Console.WriteLine("A: {0} B: {1}", A, B);
}
}

结果如下:

将static readonly修改为const,

    class Program
{
const int A = B * ; const int B = ; 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。

感谢您的阅读!

[C#] readonly vs const的更多相关文章

  1. 我所理解的readonly和const

    最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...

  2. readonly与const

    readonly与const 在C#中,readonly 与 const 都是定义常量,但不同之处在于:readonly 是运行时常量,而 const 是编译时常量. ; public void Te ...

  3. 配置文件App.config的使用以及Readonly与Const的对比

    以前我们学习的时候都把连接数据库的连接字符串写在一个类中,因为我们的数据库都在自己电脑上.如果更换数据库地址,需要更改这个类,然后重新编译才可以连接到数据库.现在我们需要将连接字符串当道一个文件中,然 ...

  4. Readonly与const初识

    对于readonly和const,很多人无法具体区分,不清楚它们的具体使用场合:现在我们分析它们之间的区别和使用场合. const是一个编译期常量:const只能用于修饰基元类型.枚举类型或者字符串类 ...

  5. Usage of readonly and const

    Many new learners can not make sure the usage scenarios of readonly and const keywords. In my opinio ...

  6. readonly和const的区别

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

  7. c#:readonly与const的区别

    readonly与const的区别: 1.初始化:const  字段只能在该字段的声明中初始化. readonly  字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...

  8. C#中的readonly跟const用法小结

    总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与rea ...

  9. 编写高质量代码改善C#程序的157个建议——建议6: 区别readonly和const的使用方法

    建议6: 区别readonly和const的使用方法 很多初学者分不清readonly和const的使用场合.在我看来,要使用const的理由只有一个,那就是效率.但是,在大部分应用情况下, “效率” ...

随机推荐

  1. bzoj4353: Play with tree

    Description 给你一棵包含N个节点的树,设每条边一开始的边权为0,现在有两种操作:   1)给出参数U,V,C,表示把U与V之间的路径上的边权变成C(保证C≥0)   2)给出参数U,V,C ...

  2. java代码-----运用endWith()和start()方法

    总结: package com.a.b; //startWith().和endWith()是检查一个字符串是否以一个特定的字符序列开始或结束 public class Sdfs { public st ...

  3. questions information

    1. 面向对象 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 三大特性: 封装: -- 将内容封装到对象中 -- 将方法疯 ...

  4. 第十一章 Helm-kubernetes的包管理器(下)

    11.5.5 开发自己的chart k8s提供了大连官方的chart, 不过要部署微服务,还是需要开发自己的chart: 1  创建chart    Helm会帮助创建目录mychart,并生成各类c ...

  5. ubuntu apt-get dpkg-scanpackages 制作本地软件源

    1. 收集软件,下载的软件都在/var/cache/apt/archives目录下 例如openstack L版的所有包 keystone,glance nova neutron....... 举例: ...

  6. Cisco动态路由 OSPF协议

    OSPF描述: 组播扩展OSPF  锁定 同义词 ospf一般指组播扩展OSPF 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . OSPF(Open Shortest Path Firs ...

  7. Windows系统版本型号MSDN版、OEM版、RTM版、VOL版区别

    我们常常听说操作系统的MSDN版.OEM版.RTM版.VOL版等等,它们到底是什么意思,有什么不同呢? (一)MSDN (Microsoft Developer Network)版MSDN软件是微软公 ...

  8. [Z]QPS、PV和需要部署机器数量计算公式

    QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计]QPS = 总请求数 / ( 进程总数 *   请求时间 )QPS ...

  9. springboot-shiro chapter02——springboot webmvc jsp

    简介:这一节主要涉及spring boot 支持jsp, 由于对spring boot不太熟悉,走了一些弯路. 环境:IDEA15+JDK1.8+Maven3+ 代码: https://git.osc ...

  10. ArcGIS 二次开发增加工具栏按钮时,给按钮图标设置失败

    在类的构造函数中通过下面的代码获得的bitmap为null: string bitmapResourceName = GetType().Name + ".bmp"; base.m ...