C#中的Const与Readonly:如何选择及区别何在?

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

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

开始课程

C#中的Const vs Readonly:区别何在及何时使用?

\n\n

每位C#开发者迟早都会面临一个两难选择:将值声明为const还是readonly?乍一看,这两个关键字做的是同一件事——禁止变量在初始化后被修改。但深入挖掘后,你会发现它们之间存在巨大差异,这些差异会影响代码的架构、性能甚至安全性。

\n\n

在本文中,我们不仅会罗列文档中的干巴巴的事实。我们将分析真实场景,揭示潜在陷阱,并帮助您做出明智的选择。开始吧!

\n\n

C#中的const是什么?

\n\n

Const 是一个编译时常量。它的值必须在编译时已知,并且在运行时不能更改。

\n\n
    \n
  • 只能是原始类型:int、double、string、bool、enum 和 null。
  • \n
  • 隐式为static——属于类型,而非实例。
  • \n
  • 值在编译阶段直接嵌入到代码中(类似于C++中的宏)。
  • \n
  • 不能与new或引用类型一起使用(string除外)。
  • \n
\n\n
public class MathConstants\n{\n    public const double Pi = 3.14159;\n    public const int MaxRetries = 5;\n    public const string AppName = "MyApp";\n    \n    // 错误!引用类型(除了string)不能使用\n    // public const List<int> Numbers = new List<int>();\n}
\n\n

当编译器遇到const时,它会将值内联到IL代码中。这意味着,如果你从另一个程序集中使用一个常量,然后更改了它的值,旧的程序集仍将使用旧值——直到它们被重新编译。

\n\n

C#中的readonly是什么?

\n\n

Readonly 是一个字段,只能在声明时或类的构造函数中初始化。之后就不能再修改它。

\n\n
    \n
  • 可以是任何类型:值类型或引用类型。
  • \n
  • 可以是静态的,也可以是实例的。
  • \n
  • 值在运行时计算(例如,可以使用new或调用方法)。
  • \n
  • 不会嵌入到代码中——它是一个带有写保护的普通字段。
  • \n
\n\n
public class Config\n{\n    public readonly DateTime CreatedAt = DateTime.Now;\n    public readonly List<string> Tags;\n    public static readonly Guid InstanceId = Guid.NewGuid();\n    \n    public Config()\n    {\n        Tags = new List<string> { "csharp", "tutorial" };\n        // 错误!不能在构造函数之后修改\n        // Tags = new List<string>();\n    }\n}
\n\n

一个重要细节:readonly只保护引用,而不保护对象的内容。如果你有一个readonly List<int>,你不能分配一个新的列表,但可以随意添加或删除元素。

\n\n

const与readonly对比:差异表

\n\n

为了巩固知识,这里有一个直观的对比:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
标准constreadonly
计算时间编译时执行时(运行时)
数据类型仅原始类型 + string任何类型
静态性隐式static可以是static或instance
可变性永远不可变仅在构造函数中可变
访问方式作为

博客

书籍推荐