1: 凡是定义的const 成员变量,皆为隐式 static 的,也就是说,要用类名来访问,而不能用对象来访问。
想想很容易理解,一个变量,初始化的值固定了,各个实例中都一样都不能改,那么,何必保存那么多份呢?static 了只存一份就OK。
当然,上述情况的前提是这个 const 变量定义为 public 的,如果是 private 的,那么外部是无法访问的,所以不存在用类访问还是用对象访问的问题。
2:当一个变量的值不希望它被改变,但是这个值的初始值又无法在编译期获得,也就是说要到运行时才能由它方得到,那么这时用const 显然不行,因为const必须在声明时即初始化。这时就要用 readonly 型,readonly 型常量只允许在构造函数中进行初始化,并且初始化后值不得再改变。
另外跟const不同的是,readonly 型的常量并不是隐式static 的,要想定义为类级别,必须手动定义其为 static 。那么既要其为 static 又要是 readonly 型只能在构造函数中初始化,那么当然必须要有静态构造函数才能完成任务!
3:readonly 型变量要求只许在构造函数中初始化,但要注意的一点是,只要是在构造函数中,readonly 型的常量,并非是一赋值就不能改了,而是可以多次改变。我觉得这一点有点不好!!!!!!如下的代码可以正常编译运行。。。。。
class MyClass1
{
private readonly double PI;
public MyClass1(double d)
{
PI = 3.1415926;
PI = 3.11111;
PI = d;
}
public void m1()
{
Console.WriteLine(PI);
}
}
4: const 跟 readonly 型常量既可以用在 class 中,也可以用在 struct 中,效果是一样的。
5: const 还可以用来修饰限定类的方法中的局部变量,而 readonly 不行!
6:const 型变量既然是一个 compile-time 变量,必须在编译时确定其值,那么它就只能容纳一些简单类型的变量,比如 int,float,double 之类的,但也不能说他只能存纳值类型的,因为 string 也可以适用。反之另一些系统定义的值类型的结构如: DateTime 型变量又不能用 const 来进行限制。如下面的代码,是编译通不过的:
class MyTestClass
{
public const DateTime dt=new DateTime(2010,07,26,0,0,0);
...
}
也即是,凡是要用 new 关键字才能初始化的类型变量,均不能被设置为 const 。
但是 readonly 没有这个限制,因为它的初始化是在运行时的构造函数中进行的。
7:关于 readonly ,这里有个讨论也很有趣:关于 C# readonly 关键字的分析
亮点在评论。