常量 const
常量是指变量在生命周期内值不会发生变化。常量可以修饰字段和局部变量。
常量必须在声明时初始化。赋值后就不能再被改写。
赋值给常量的值必须是常量,即确定的值,不能将变量赋值给常量。
常量总是隐式静态的,但是常量不能被static修饰。
class Program
{
const int age = 1;//常量字段
static void Main()
{
const int age = 5;//局部常量
Console.WriteLine($"age's type is {Program.age}");
Console.WriteLine($"age's type is {age}");
}
}
readonly 修饰符
readonly可以修饰字段,但是不能修饰局部变量,其作用和const类似,一旦值被设定就不能修改。
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Readonlyclass readonlyclass = new Readonlyclass();
readonlyclass.WriteLine();
}
}
public class Readonlyclass
{
static readonly string staticField;
readonly string field;
static Readonlyclass()
{
//当声明值类型时,它会经历默认初始化,其中所有值类型字段均设置为零,所有引用类型字段都设置为 null 。
//仅保证在调用类型的实例构造函数或静态成员之前运行显式静态构造函数。
//因此,如果创建类型时未调用实例构造函数,则不保证静态构造函数运行。
staticField = "StaticField";
}
public Readonlyclass()
{
field = "Field";
}
public void WriteLine()
{
Console.WriteLine($"staticField is {staticField}");
Console.WriteLine($"Field is {field}");
}
}
}
不可变的类型
如果类型包含可以改变的成员,他就是可变的类型。
如果对象没有任何可以改变的成员,只有只读成员,它就是不可变类型。不可变类型的成员只能在初始化时设置。
不可变类型的的一个例子就是String类。
readonly字段 和 const字段的区别
1.const字段只能在字段的声明语句中初始化;readonly字段可以在字段的声明语句中初始化,实例readonly字段可以在实例构造函数中初始化,静态readonly字段必须在static构造函数中初始化。
2.const字段的值必须在编译器确定,而readonly字段可以在运行期通过调用不同的构造函数来确定。
3.const字段类似于静态字段,而且没有储存位置;readonly字段可以是实例或者静态字段,且有储存位置。