引言:一场永不过时的永恒争论
想象一下这个场景:你在用 C# 编写代码,需要声明一个不应改变的值。第一个念头是 const。第二个是 static readonly。第三个则是:“这到底有什么区别?”
这个问题是 Stack Overflow 上最热门的问题之一。成千上万的开发者,从新手到资深专家,一直在争论哪个更好。而在 2025 年,随着 .NET 和 C# 13 新版本的发布,这个选择变得更加有趣了。
在本文中,我们将一劳永逸地弄清楚何时使用 const,何时使用 static readonly。您不仅会学到理论知识,还会获得今天就能应用的明确规则。
这些修饰符背后隐藏着什么?
const:硬性常量
C# 中的 const 修饰符,字面意思就是“刻在石头里”的值。它必须在编译时已知。编译器会在所有使用该常量的地方,直接将值替换到代码中。
public class MathConstants{ public const double Pi = 3.14159; public const int DaysInWeek = 7; public const string AppName = "MyApp";}请注意:const 始终是隐式 static 的。你不能写成 static const——编译器会报错。
static readonly:灵活的不可变性
static readonly 修饰符是一个字段,它只初始化一次,之后不再改变。主要区别在于:该值可以在程序运行时计算得出。
public class AppSettings{ public static readonly DateTime ReleaseDate = new DateTime(2025, 1, 15); public static readonly Guid InstanceId = Guid.NewGuid(); public static readonly string ConfigPath = GetConfigPath(); private static string GetConfigPath() { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "config.json"); }}关键区别:快速对比表
让我们用一张清晰的表格来梳理所有要点:
| 特性 | const | static readonly |
|---|---|---|
| 初始化时机 | 编译时 | 运行时(静态构造函数) |
| 允许的类型 | 仅限基本类型(int, double, string, enum, bool) | 任何类型(包括引用类型) |
| 内存 | 值被复制到每个程序集 | 内存中的单一引用 |
| 版本兼容性 | 更新库时可能出现问题 | 安全 |
| 性能 | 最高(编译时替换) | 首次访问时略有开销 |
何时选择 const?
在以下情况下使用 const:
- 值绝对不可变——数学常量(π, e)、每周天数、物理常量。
- 值必须在编译时可用——例如,用于属性、switch/case、默认参数。
- 你控制着所有代码——并且确信库不会单独更新。
// 非常适合 constpublic class Physics{ public const double SpeedOfLight = 299792458; // 米/秒 public const double GravitationalConstant = 6.67430e-11; // 米³/(千克·秒²)}
// 在属性中使用 —