readonly作用类似于声明一个字段为const,一旦值被设定就不能改变。
1.const字段只能在字段的声明语句中初始化,不能在声明后给它赋值。而readonly字段可以在字段声明语句中赋值,也可以在类的任何构造函数中赋值(如果是static字段,必须在static构造函数中完成初始化)。
2.const没有自己的存储位置,而是在编译时被编译器替换(const成员表现很像一个静态量,但不能声明为static的原因)。所以它的值必须在编译期决定。而readonly字段的值可以在运行期决定。它在内存中有位置。所以允许在不同的环境或者不同的构造函数中设置不同的值。
3.const总是像静态的,它们对于每个实例都是可见的,而且即使没有类的实例也可以使用。 readyonly可以是静态字段也可以是实例字段。
Demo:
class Shape
{
//初始化
readonly double PI = 3.1416;
//未初始化
readonly int NumberOfSides;
public Shape(double side1, double side2)
{
//表示一个矩形
NumberOfSides = 4;
//......some code
}
public Shape(double side1, double side2, double side3)
{
//表示一个三角形
NumberOfSides = 3;
//......some code
}
}