C#面试题更新 2026-08-05

在C#编程语言里,使用readonly关键字声明的字段和使用const关键字定义的常量之间存在哪些主要区别?请从初始化时机、赋值方式、存储位置和使用限制等角度进行说明。

技术原理C#

考察说明

考察对C#中readonly字段与const常量在定义、初始化、版本兼容性及使用场景上的理解。

回答思路

  1. 【回答框架 1】readonly字段是运行时常量,其值在对象实例化或静态构造函数中赋值,之后不可修改;const常量是编译时常量,其值在编译时确定,直接嵌入到IL代码中。
  2. 【回答框架 2】readonly字段可以修饰实例字段或静态字段,const常量隐含为静态字段,但只能修饰基元类型、字符串或枚举类型,且不能用new修饰。
  3. 【回答框架 3】readonly字段在声明时可以不初始化,但在构造函数中必须赋值,const常量在声明时必须初始化。readonly字段的内存分配在运行时进行,const常量不占实例内存,直接编译到使用代码中。
  4. 【回答框架 4】从版本兼容性看,修改const常量需要重新编译所有引用该常量的程序集,而修改readonly字段则无需重新编译引用程序集,因此readonly更适用于公共API中的常数值。
  5. 【回答框架 5】选择时,若值在编译时确定且永不改变,可用const;若值需在运行时确定或可能随版本变化,应使用readonly。
  6. 【关键点 1】readonly字段是运行时只读,const常量是编译时常量。
  7. 【关键点 2】const常量必须用常量表达式初始化,且只能用于基元类型、字符串或枚举。
  8. 【关键点 3】const常量使用时直接嵌入IL,修改后需全量重新编译;readonly字段则无此问题。
  9. 【关键点 4】readonly字段可在实例或静态构造函数中赋值,const常量不支持。
  10. 【关键点 5】在公共API中,为避免版本兼容问题,优先使用readonly,而非const。
  11. 【易错点 1】混淆两者的编译期与运行期行为,误将const当只读字段使用。
  12. 【易错点 2】对引用类型使用const,导致编译错误。
  13. 【易错点 3】在版本更新时仅修改const值,未重新编译所有引用程序集,造成旧值残留。