C#几对修饰符的比较(一)const与readonly

const修饰符用来声明常量字段或常量局部变量;readonly修饰符用来声明字段是”只读”的。

二者的作用相似,都是修饰声明一个常量。但在实现方式上有所区别,因此也有很多特性区别,导致它们的实际应用场合也不同。

二者根本的差别在于:const修饰的是静态常量,readonly修饰的是动态常量。

静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享,==它的值是在编译时就被替换了的==。

  • 因此理所当然的,静态常量在运行时不占用内存,十分高效。
  • 但这也导致它只能被声明为简单的数据类型(内建的int和浮点型)、枚举或字符串。
  • 由于静态常量是隐式静态的,即被static隐式修饰过,所以不能再用static重复修饰。
  • 在使用上,静态常量必须在声明时赋值初始化。不能用new关键词初始化,因为new将会导致到运行时才能确定值。
    > 应用场合: 比如Math.PI的定义。
    > 这种从不改变且处处唯一的常量,就应该使用静态常量。
    > 其实可以把它当作一种code阶段的特殊通配符来理解,如果勤快的话,把所有静态常量用CTRL+F替换成想要的值,编译后的效果和使用静态常量应该也是完全一致的。

动态常量,也称运行时常量(runtime constants),属于对象级,通过对象访问。==它的值是在运行时获得的==。

  • 由于需要在运行时存放常量,所以有内存消耗。
  • 动态常量除了基本的数据类型外,还可以被声明为一些对象类型。
  • 配合static修饰符,即通过static readonly修饰,可以使动态常量也能够通过类名直接访问,被所有对象共享。这也常被作为const的灵活替代方案。
  • 动态常可以在声明是初始化,也可以在构造函数里初始化。需要注意的是,static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数。
    > 应用场合: 个人还没有应用到过,但临时想到的有比如程序当前运行环境的记录。
    > 这种在运行时才能确定的,且直到运行结束都不会改变的常量,可以使用动态常量。

参考

const(C# 参考)

readonly(C# 参考))

总结const、readonly、static三者的区别

const 与 readonly知多少

发表评论

电子邮件地址不会被公开。 必填项已用*标注