C# const 和 static readonly 定义常量字符串

30 阅读2分钟

在定义常量字符串的时候,习惯性使用 static readonly 。今天突然被问到 static readonly const 使用的区别,竟然说不清楚啦?

kimi结果如下, conststatic readonly字段都用于定义常量,但它们之间存在一些关键的区别:

const 常量字符串

  • 编译时编译const常量在编译时就已经确定,编译器会将const常量的值内嵌到代码中,因此它们不占用运行时内存。
  • 类型限制const常量只能用于内置的基本数据类型,包括字符串。
  • 不可更改const常量一旦定义,其值不能被修改。
  • 作用域const常量通常在定义它们的文件内可见,但也可以被设置为public,使其在其他文件中可见。
  • 性能:由于const常量在编译时就确定,因此访问它们非常快速,没有运行时开销。

static readonly 常量字符串

  • 运行时初始化static readonly字段在运行时初始化,通常在类的构造函数或静态构造函数中赋值。
  • 类型灵活static readonly可以用于任何类型,包括用户定义的类和结构体。
  • 不可更改:一旦static readonly字段被初始化,其值就不能被修改。
  • 作用域static readonly字段是类级别的,可以在类的任何静态上下文中访问。
  • 延迟绑定static readonly字段支持延迟绑定,可以在静态构造函数中进行初始化。

联系

  • 不可变性:无论是const还是static readonly,它们定义的值都是不可变的。
  • 性能优化:两者都可以提高性能,因为它们都是常量,编译器可以对它们进行优化。

使用场景

  • 使用const当你需要一个编译时常量,且这个常量是基本数据类型或字符串。
  • 使用static readonly当你需要一个在运行时初始化的常量,或者需要一个复杂类型的常量。

避坑点

  • 既然 const 是编译时常量,那么当定义的值发生变化时,若是在其他的项目中引用,则此时也需要把其他项目重新编译下,才能获取到更新后的新值。