Const
用于指定字段或局部变量的值是常数,不能被修改。常量的值在编译的时候确定,编译后,CLR将常量的值保存在Assembly的原数据中。当代码引用常量时,CLR在元数据中查找该符号,将提取的常量值嵌入到IL中,所以常量没有地址以及相应的分配内存,而且不能通过引用传递变量
readOnly
在字段上使用的修饰符,表示该字段是只读的。当一个字段在声明为readOnly的时候,只有两种方式可以对其赋值,即作为声明的一部分出现,或者在同一类的构造函数中。
对于实例字段,在包含字段声明的类的实例构造函数中;或者,对于静态字段,在包含字段声明的类的静态构造函数中。也只有在这些上下文中,将
因此,Const必须在声明就初始化,它既可用来修饰类中的成员,也可修饰函数体内的局部变量。readOnly既可以在声明时初始化也可以在构造器中初始化,因此根据使用的构造函数可能具有不同的值,它只可以用于修饰类中的成员。
Const和Static readOnly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。但由于他们本质的区别,Const只能修饰字符串和整形等值类型的数据。
static readonly MyClass myins = new MyClass();
static readonly int [] constIntArray = new int[] {1, 2, 3};
void SomeFunction()
{
const int a = 10;
...
}
这种情况下就不能换成 Const 但下面这种情况就可以
static readonly A = B * 20;
static readonly B = 10;
下面就一些例子来说明下:
using System;
class P
{
static readonly int A=B*10;
static readonly int B=10;
static readonly int C=B*10;
public static void Main(string[] args)
{
Console.WriteLine("A is {0},B is {1},C is {2},",A,B,C);
}
}
对于上述代码,输出结果是多少?很多人会认为是A is 100,B is 10,C is 100吧!其实,正确的输出结果是A is 0,B is 10,C is 100。因为给A赋值时,B并没有赋值为10,它的值为0
class P
{
const int A=B*10;
const int B=10;
const int C=B*10;
public static void Main(string[] args)
{
Console.WriteLine("A is {0},B is {1},C is {2},",A,B,C);
}
}
对于上述代码,输出结果又是多少呢?这次正确的输出结果是A is 100,B is 10,C is 100 因为B是常量,在编译期间就赋值了