[C#]readonly vs const

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。

感谢您的阅读!

时间: 2024-08-02 02:45:32

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

转载:readonly和const比较

原文地址:http://www.cnblogs.com/panjun-Donet/archive/2008/03/28/1127680.html 前天犯了个低级错误,是关于readonly的,总结了一下:    C#的readonly关键字只能在字段上面使用public readonly TcpClient client;不能在类,方法,属性上面使用readonly!!顺便看了一下readonly和const的区别: readonly和const都是用来标识常量的. const可用于修饰clas

我所理解的readonly和const

最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数. 什么是编译时常数,什么是运行时常数呢.我想做下面的实验,关于readon

readonly和const的区别

readonly与const的区别1.const常量在声明的同时必须赋值,readonly在声明时可以不赋值2.readonly只能在声明时或在构造方法中赋值(readonly的成员变量可以根据调用不同的构造方法赋不同的值)3.const前面不能添加static(因为Const本来就是一个静态常量),readonly前面可以添加static4.const在编译的时候赋值,readonly在运行的时候赋值5.const能在方法内声明,readonly不能在方法内声明 class ReadOnlyA

readonly 与 const

readonly MSDN定义:readonly 关键字是可以在字段上使用的修饰符.当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中. readonly修饰的字段只能在两个地方对其赋值,第一个是初始化字段的时候,第二个是构造函数中. 1 class Age 2 { 3 //第一个可赋值的地方 4 //private readonly int _year = 20; 5 readonly int _year; 6 7 Age(i

Break 、Continue 和ReadOnly、Const和Ref和Out params

Break和Continue区别 之前对于Break和Continue:ReadOnly和Const:ref和out,params之类的基础东东学习过,但是一直没有仔细去研究到底是怎么一回事儿,最近在开发中用到了,仔细来做个总结: 1.Break和Continue //break是跳出整个循环体,不再执行本循环,continue是结束单次循环,继续下一次循环. //更多问题 联系QQ 931697811(夜雨梧桐) 1 #region Break测试 2 3 Console.WriteLine(

C#中的readonly与const

比较C#中的readonly与const C#中有两种常量类型,分别为readonly(运行时常量)[read-run]与const(编译时常量)[const-compile],本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理     readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量.    const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值.    下面声明两个常量:  public stati

C#中的readonly跟const用法小结

总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写.那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants).这两者具有不同的特性

C#基本知识点-Readonly和Const的区别

目录 什么是静态常量(Const)和动态常量(Readonly) 静态常量(Const)和动态常量(Readonly)之间的区别 动态常量(Readonly)被赋值后不可以改变 总结 什么是静态常量(Const)和动态常量(Readonly) 先解释下什么是静态常量(Const)以及什么是动态常量(Readonly). 静态常量(Const)是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值. 动态常量(Readonly)的值则是在运行的那一刻才获得的,编译器编译期间将其标示

两种常量类型-readonly和const

C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量. const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值. 下面声明两个常量: public static readonly int A = 2; //A为运行时常量public const int B = 3; //B