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

来源:这里教程网 时间:2026-02-21 17:32:50 作者:

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

const:编译时常量

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

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

例如:

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

readonly:运行时常量

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

基本上就这些。

相关推荐