C#中const与readonly的区别?

在学习C#的过程中,看到了一个问题:const与readonly的区别?看了书上的解释,仍然不是很明白,觉得自己在学习的过程中有必要深究一下,于是写下这篇博客,希望有进一步的认识。

C#提供了两种类型的常量,一种就是我们常用的const(这个想必大家都比较熟悉,其他语言比如C++等中也有常量const的使用)关键字声明,另一种是用readonly关键字声明。这里首先说下两者的本质区别:用const声明的是真正的常量,而用readonly声明的实际上是“只读的变量”,只读大家都知道,文本框中的文本设置为只读以后,就不能够修改了,那和const究竟有什么不同?const不是也不可以更改吗?这里疑惑就来了。

const声明的常量在编译时候进行设置并且设置后就永远不能再修改,此时编译器会把程序中所有const常量全部替换为常数,而readonly声明的常量在程序运行期间被初始化,该操作只能进行一次。另外,const常量只能在声明中赋值,readonly常量的初始化既可以在声明中进行,也可以在构造函数中进行。使用构造函数,readonly字段可以被赋予不同的值。在readonly关键字的前面加上static,其作用就相当于定义一个常量,区别是二者的初始化一个在编译时候进行,一个在运行时候进行。const用来声明编译时候的常量,readonly用来声明运行时候的常量。

明白否?反正书上是这么说的,说实话,我读了好多遍,仍然不明白,最好能有个列子!

关键的一句话:const 字段只能在该字段的声明中初始化。   readonly 字段可以在声明或构造函数中初始化。       因此,根据所使用的构造函数,readonly 字段可能具有不同的值。

下面的 程序,声明了两个readonly变量,一个是在声明的时候级初始化了,一个是在构造函数中初始化,根据构造函数选择的参数的不同,你所声明的readonly变量也会有所不同。


 public class ReadOnlyTest

    {

       class SampleClass

       {

          public int x;

          // Initialize a readonly field

          public readonly int y = 25;

          public readonly int z;

          public SampleClass()

          {

             // Initialize a readonly instance field

             z = 24;

          }

          public SampleClass(int p1, int p2, int p3)

          {

             x = p1;

             y = p2;

             z = p3;

          }

       }

       static void Main()

       {

          SampleClass p1 = new SampleClass(11, 21, 32);   // OK

          Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);

          SampleClass p2 = new SampleClass();

          p2.x = 55;   // OK

          Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);

       }

    }

    /*

     Output:

        p1: x=11, y=21, z=32

        p2: x=55, y=25, z=24

    */

似乎有一点明白了,其实,个人认为这并不难理解(虽然纠结了很久),const在你声明的时候就必须赋一个值(当然赋一个你知道的值,而且这个值对你有用的)。readonly所声明的变量可以在函数运行时得到的其他值通过构造函数赋给它(这个值可能根据你程序运行时输入的不同,在运行过程中产生的结果也不同,是一个你需要的并且它在产生后不能够改变的)。

不知道自己理解的对不对,希望大家共同学习进步吧!(中间的一些说明引用自一些资料,程序段引用自MSDN)

 

猜你喜欢

转载自blog.csdn.net/u011353570/article/details/16641009