在C#中,const与readonly定义的值都不能更改,可用于常量的定义,但二者在使用时又存在着一些区别。
1.const
C#使用关键字const声明常量字段或局部变量,C#中的字段是在类或结构中直接声明的变量。以下值类型可以声明为常量:int, long, char, float, double, decimal, bool, byte, short,string。
const定义的常量只能读取不能更改,并且只能在定义时初始化,不能在构造函数、其它属性或方法中初始化。不能将一个常量变量声明为静态变量,因为const定义的字段属于类访问,类似于静态变量,只能通过类名来访问。例如:
public const int EXAMPLE = 1;
Console.WriteLine(ConstTest.EXAMPLE);
另外,const只能定义值类型与字串,若定义引用类型的变量,只能初始化为null。
2.readonly
readonly定义的变量在运行期间也只能读取不能更改,但readonly分为实例只读变量与静态只读变量。可声明的值类型包括:int, long, char, float, double, decimal, bool, byte, short,string。
实例只读变量在定义时或者实例构造函数中初始化,能通过对象访问,例如:
public class ReadOnlyClass
{
public readonly int temp = 0;
public ReadOnlyTest()
{
temp = 1;
}
}
访问形式:
ReadOnlyClass example = new ReadOnlyClass ();
Console.WriteLine(example.temp);
static readonly 为静态只读变量,可以在定义时或者静态构造函数中初始化,能通过类名称访问,例如:
public class ReadOnlyClass
{
public static readonly int TEMP = 1;
}
访问形式:
Console.WriteLine(ReadOnlyClass.TEMP);
3.区别
const | readonly |
---|---|
应用于字段或局部变量。 | 应用于字段。 |
在公开的时候分配常量字段。 | 可以在声明或构造函数时指定,而不是在任何其他方法中。 |
没有分配内存,因为在编译后,在IL代码中嵌入了常量值。 | 分配动态内存,可在运行时获取。 |
默认静态,只能通过类名访问。 | 需要过类实例访问的对象,添加static关键字后,可成为类成员。 |
值是常量。 | 属于类的对象,根据使用的构造函数,值可能会有所不同。 |
对某些类(非原始类型)声明常量,应将其赋值为null。 | 声明非基本类型(引用类型)时,只有引用是不可变的,而不是包含的对象。 |