C#中const和readonly有什么不同 – 定义不可变常量的两种方式

1次阅读

const是编译时常量,值必须在声明时确定且仅支持基本类型和enum;readonly是运行时常量,可在构造函数中赋值,支持任意类型,可为实例成员。

C#中const和readonly有什么不同 – 定义不可变常量的两种方式

在C#中,constreadonly 都可用于定义不可变的值,但它们在使用方式、生命周期和适用场景上有本质区别。理解这些差异有助于写出更安全、高效的代码。

const:编译时常量

const 用于声明编译时常量,其值必须在编译时就能确定,并且一旦定义就不能更改。

  • 只能用于基本数据类型(如 intStringdouble)、enum 类型或 NULL 引用类型
  • 值必须在声明时赋值,不能在构造函数或其他地方设置。
  • 属于类级别,隐式静态,访问时不需要实例对象
  • 在编译时会被直接替换为对应的字面值,不占用运行时内存空间。

例如:

public const int MaxCount = 100; public const string appName = "MyApp";

readonly:运行时常量

readonly 字段的值可以在声明时或构造函数中赋值,之后不能再修改,适用于运行时才能确定的值。

C#中const和readonly有什么不同 – 定义不可变常量的两种方式

度加剪辑

度加剪辑(原度咔剪辑),百度旗下AI创作工具

C#中const和readonly有什么不同 – 定义不可变常量的两种方式 359

查看详情 C#中const和readonly有什么不同 – 定义不可变常量的两种方式

  • 可以是任意类型,包括自定义类、数组等复杂类型。
  • 允许在构造函数中根据逻辑动态赋值,灵活性更高。
  • 每个实例可以有不同的 readonly 值(除非配合 Static 使用)。
  • 值在运行时确定,不会被编译器内联替换。

例如:

public readonly DateTime CreatedTime; public readonly List<string> Tags;  public MyClass() {     CreatedTime = DateTime.Now;     Tags = new List<string> { "default" }; }

关键区别总结

  • 赋值时机:const 必须在编译时确定;readonly 可在运行时通过构造函数赋值。
  • 类型限制:const 不支持复杂对象;readonly 没有此限制。
  • 静态性:const 隐式静态;readonly 可以是实例成员。
  • 性能影响:const 被内联,无字段访问开销;readonly 是真正的字段,有存储和访问成本。

选择哪个取决于具体需求:如果值固定且简单,优先用 const;如果需要运行时初始化或使用复杂类型,应使用 readonly

基本上就这些。

text=ZqhQzanResources