c#:readonly与const的区别

时间:2024-01-11 18:43:38
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的运行时常数值可以在静态构造器中再次被改变
    }
}