C#--静态常量const和动态常量readonly

常量

Const关键字

Readononly关键字

const 静态常量

常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变。常量使用const修饰符声明。只有 C# 内置类型(int,float)可声明为 const。 除 String 以外的引用类型常量只能使用 null 值进行初始化,所以对于引用类型的常量值唯一可能是字符串和 null 引用。用户定义类型(包括类,结构,数组)不能使用const声明。

alt

  1. 常量在声明时必须初始化。
  2. 常量是作为静态字段访问的,因为常量的值对于该类型的所有实例都是相同的。不允许使用static修饰符。
  3. 常量可以参与常量表达式。

const关键字

使用 const 关键字来声明常量(可作为静态字段访问)。

readonly动态常量

将readonly关键字作为修饰符的地方:

  1. 字段声明中
  2. readonly struct在类型定义中
  3. 在结构类型中的实例成员声明中
  4. ref readonly在方法返回中

这里只说在字段声明中的作用。

readonly修饰的字段只能在声明期间或在同一个类的构造函数中赋值。在构造函数中可以多次和重新分配readonly字段。

alt

构造函数退出后不能为readonly字段做赋值操作。此规则对于值类型和引用类型具有不同的含义:

  1. 由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。
  2. 由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一对象。 该对象可能是可变的。 readonly 修饰符可防止将字段值替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。

示例图: alt

readonly声明的字段不能够作为静态字段访问;必须显示声明。

const 静态常量 和 readonly 动态常量 的区别

const

  • 用于声明编译时常量,这意味着它的值必须在编译时就确定,并且在声明时就必须初始化。
  • 常量的值在编译期间被解析,编译器会将所有对该常量的引用替换为其值。
  • 变量默认是静态的,无法通过实例访问,只能通过类名访问。
  • 可以在类中或方法体内声明,但它的数据类型受限,只能是基本数据类型、枚举、字符串或 null 引用类型。

readonly

  • 用于声明运行时常量,它的值可以在构造函数中设置,因此可以在运行时确定。
  • 字段可以在声明时或在任何构造函数中初始化,但一旦构造函数执行完毕,它的值就不能再改变。
  • 字段不是静态的,除非显式地使用 static 关键字声明。如果将 readonly 设置为静态,则必须在类级别声明。
  • 字段可以是任何类型,包括用户定义的类型。
public static readonly uint a1 = (uint)datetime.now.ticks;

alt

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务