Static readonly 还是 const 在 C# 中:2025 年该如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:一场永不过时的永恒争论



想象一下这个场景:你在用 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; // 米³/(千克·秒²)}

// 在属性中使用 —

博客

书籍推荐