C# init访问器是什么 - C# 9.0中的只读属性初始化

月夜之吻
发布: 2025-12-14 00:49:09
原创
541人浏览过
init访问器是C# 9.0引入的仅限对象初始化阶段使用的属性设置器,支持在对象初始化器中为只读属性赋值,之后不可修改,增强不可变性,适用于DTO、record等场景。

c# init访问器是什么 - c# 9.0中的只读属性初始化

init访问器是 C# 9.0 引入的一种特殊属性设置器,用于在对象初始化期间为只读属性赋值,之后该属性便不能再被修改。它解决了以往只读属性(即仅有 set 的私有或无设置器的属性)无法在对象初始化器中设置的问题。

什么是 init 访问器?

在 C# 9.0 之前,如果一个属性只有 get 没有 set,就不能在对象初始化器中赋值:

public class Person
{
   public string Name { get; private set; } // 或者没有 set
}

// 以下代码会报错:
var person = new Person { Name = "Alice" }; // 错误:Name 不能在此处设置

有了 init 访问器后,你可以这样写:

public class Person
{
   public string Name { get; init; }
}

// 现在可以正常初始化:
var person = new Person { Name = "Alice" }; // 成功!

这个 init 访问器只允许在对象创建时通过对象初始化器设置一次,之后就无法再修改,即使在类内部也不行(除非通过构造函数等其他方式)。

Playground AI
Playground AI

AI图片生成和修图

Playground AI 99
查看详情 Playground AI

init 访问器的核心特点

  • 仅限对象初始化阶段使用:只能在 new 表达式配合对象初始化器时调用。
  • 不可变性增强:确保属性一旦初始化完成,就变成真正只读,有助于构建不可变类型。
  • 替代传统 setter:可以用 init 替代 set,实现更安全的封装。
  • 支持继承场景:子类可以在其构造函数或初始化器中为基类带有 init 的属性赋值。

实际应用场景

init 访问器特别适合用于数据传输对象(DTO)、配置类、记录类型(record)等需要不可变性的场景。

public record Point(int X, int Y);

// 等价于:
public class Point
{
   public int X { get; init; }
   public int Y { get; init; }

   public Point(int x, int y)
   {
      X = x;
      Y = y;
   }
}

结合 record 类型,C# 提供了简洁语法来定义不可变类型,而 init 是背后的关键机制之一。

注意事项

  • init 访问器不能在普通方法、属性或构造函数之外被调用。
  • 不能同时拥有 setinit,它们互斥。
  • 反序列化框架(如 System.Text.Json)已支持 init 访问器,可正常反序列化只读属性。

基本上就这些。init 访问器虽小,却是 C# 向更现代、更安全的不可变编程迈出的重要一步。不复杂但容易忽略细节。

以上就是C# init访问器是什么 - C# 9.0中的只读属性初始化的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号