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. Hibernate学习6—Hibernate 映射类型

    第一节:基本类型映射 com.cy.model.Book.java: package com.cy.model; import java.sql.Blob; import java.util.Date ...

  2. java web 程序---刷新页面次数

    <%! int count=0; %> <% count++; session.setAttribute("count",count); out.print(&q ...

  3. Java 打印一个心心

    package Day8_06; public class For { public static void main(String[] args) { System.out.println(&quo ...

  4. Centos6-7安装Python3.5以及SSL的编译安装,识别https

    Python3中无法导入ssl模块的解决办法 如果你发现在python3脚本运行过程中发现涉及到ssl模块都无法运行的情况下.那么需要进行如下步骤 第一步: yum install openssl o ...

  5. 非常漂亮js动态球型云标签特效代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" import="j ...

  6. python学习(二十一) Python 中的链式赋值

    Python的链式赋值如下:

  7. HDU5336题解

    解题思路 这题思路并不难,主要问题是,不太好编码实现(可能是本人练习不够吧),因为有个时间在里面,而且每个小水滴都同时流动,感觉好复杂的样子.比赛时,我首先想到的是DFS+时间流做参数,由于比赛时神经 ...

  8. 1_python小程序之实现用户的注册登陆验证功能

    python小程序之实现用户的注册登陆验证功能 程序扼要简述:  一.程序流程:1.程序开始2.判断本地文件/数据库是否已存在用户信息,存在则跳转到登陆,否则跳转到注册,注册成功后后跳转到登陆3.判断 ...

  9. Vue基础知识之指令和生命周期(一)

    优点:轻量易学,灵活. 核心:通过尽可能简单的API来实现响应的数据绑定和组合的视图组件. 1.数据绑定:数据改变,驱动视图的自动更新. 2.视图组件化:把整个网页拆分成一个个区块,每个区块都可以看成 ...

  10. C命令行参数

    总是忘了,在这里说明下. argc是命令行参数的实际个数,从1开始. 第一个是可执行文件的名称 argv[]的元素是字符串 每个元素是个命令行参数. #include<stdio.h> i ...