readonly与const的区别:
1.初始化:const 字段只能在该字段的声明中初始化。 readonly 字段可以在声明或构造函数中初始化。
2.值: const 字段是编译时常量(const本身是static,不能与static一起使用),readonly 字段可用于编译时常量,也可用于运行时常量。const修饰的字段其值不能被改变,只有一个值;readonly 字段的值(包括运行时常量的值和编译时常量的值)可以在所使用的构造函数中被改变,即readonly 字段可能具有不同的值。
class Class1 //实例成员应用readonly
{
//readonly在声明时初始化
public readonly double x = 58.5;//此时x与y没区别
public const double y = 58.5;
public readonly double a = int.Parse("58.5");
//public const double b = int.Parse("58.5");//报错:b的表达式必须是常量
public readonly int c = (int)new Random().Next(10,20);
//public const int d = (int)new Random().Next(10, 20);//报错:d的表达式必须是常量
//readonly在构造器中初始化
public Class1()
{
x = 12;
//y = 12;//报错:赋值号左边必须是变量、属性或索引器,也就是说const值不能再次赋值
c = (int)new Random().Next(10, 20);
}
}
class Class2 //静态字段使用readonly
{
//readonly修饰静态字段时可以在声明时初始化
public static readonly double x = 58.5;//此时x与y没区别
public const double y = 58.5;
public static readonly double a = int.Parse("58.5");
//public const double b = int.Parse("58.5");//报错:b的表达式必须是常量
public static readonly int c = (int)new Random().Next(10,20);
//public const int d = (int)new Random().Next(10, 20);//报错:d的表达式必须是常量
//readonly修饰静态字段时也可以在静态构造器中初始化
static Class2()
{
x = 12;//readonly的编译时常数值可以在静态构造器中再次被改变
//y = 12;//报错
c = (int)new Random().Next(10, 20);//readonly的运行时常数值可以在静态构造器中再次被改变
}
}