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

请解释 C# 9 中引入的初始化器特性,特别是 init 访问器的作用与用法,并说明它与传统 set 访问器的区别。

技术原理C#

考察说明

考查对 C# 9 新增的 init 关键字及其属性初始化机制的理解。

回答思路

  1. 【回答框架 1】init 是 C# 9 引入的属性访问器,用于在对象初始化期间设置属性值,之后变为只读。它允许在对象初始化器或构造器中赋值,但禁止在其他地方修改。
  2. 【回答框架 2】与 set 访问器相比,init 访问器仅允许在对象创建时赋值,之后任何修改都会导致编译错误。这提供了不可变对象的安全初始化,同时保持灵活的创建方式。
  3. 【回答框架 3】init 访问器可以用于属性、索引器,并且支持表达式主体定义。它通常与记录(record)类型和位置参数一起使用,以简化不可变类型的创建。
  4. 【回答框架 4】实际用法:定义一个具有 init 访问器的属性,然后在对象初始化器中通过属性赋值来初始化对象。编译器会确保之后无法修改该属性,从而增强了代码的安全性和可维护性。
  5. 【关键点 1】init 使属性在对象创建后可写,之后变为只读。
  6. 【关键点 2】init 可用于属性、索引器,支持初始化器和构造器赋值。
  7. 【关键点 3】init 是 C# 9 中实现不可变对象的关键特性,常与记录类型结合。
  8. 【易错点 1】不要混淆 init 和 readonly:readonly 是字段级别,init 是属性访问器级别。
  9. 【易错点 2】init 禁止在对象创建后修改,但允许在对象初始化器或构造器中赋值。
  10. 【易错点 3】确保了解 init 对反射的影响:反射仍可修改 init 属性,但不符合设计意图。