新闻中心

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

2025-12-14
浏览次数:
返回列表
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中的只读属性初始化的详细内容,更多请关注其它相关文章!


# json  # 网站推广观后感  # 朔州短视频seo费用  # 睢宁数据网站推广公司  # 中山市seo价格  # 文成新区网站优化招聘  # seo排名优化精准  # 网站建设基础图片素材  # 安利网站建设美丽  # 栾城网站优化seo服务  # 却是  # 你可以  # 操作指南  # 如何将  # 如何使用  # 仅限  # 能在  # 序列化  # 器中  # 子类  # c#  # js  # 云南seo服务电话 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  快手极速版在线观看 官方网页版登录地址  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  b站赚钱渠道_b站收益来源  J*aScript数组对象转换:按指定键分组与值收集  微博网页版主页入口 微博官方网站免登录访问  在Pyomo中实现基于变量的条件约束:Big-M方法详解  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  J*a递归快速排序中静态变量导致数据累积问题的解决方案  反效果?《战地6》免费试玩开启后玩家数不升反降  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  12306选座如何查看座位示意图_12306座位示意图解读与使用  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  AO3最新可访问网址 Archive of Our Own官方在线入口  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  ArrayList与LinkedList核心操作的Big-O复杂度分析  Archive of Our Own官网直达 AO3最新可用地址一览  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  微信网页版官方入口直达 微信网页版网页版登录使用方法  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  vivo云服务网页版登录 怎么登录vivo云服务网页版  使用J*aScript检测输入元素是否包含在特定类中  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  qq音乐在线播放入口_qq音乐电脑版登录链接  word中如何让数字纵向排列_Word数字纵向排列方法  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  steam官方网页快速访问 steam账号注册全流程  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  C++如何生成随机数_C++ random库使用方法与范围设置  如何仅使用CSS更改登录界面背景图像图标的颜色  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  蛙漫安全无毒 官方认证的绿色入口  将HTML动态表格多行数据保存到Google Sheet的教程  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  AO3镜像入口大全 AO3网页版内容访问全集  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  Typer应用中灵活处理命令行参数的令牌化与解析  解决Python logging 中 datefmt 导致时间戳固定不变的问题  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  Tailwind CSS line-clamp 布局问题解析与修复指南  Lar*el递归关系中排除子孙节点的策略  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  海量存储:机器视觉智能化的核心基石  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  漫蛙2漫画入口 漫蛙正版网页漫画直达网址 

搜索