您的位置:首页 > 编程语言 > C#

C#中const与readonly的区别?

2013-11-17 22:33 148 查看
在学习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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: