init关键字是C#9新增的语法,用于属性或索引器中定义访问器。使用init关键字定义的访问器具有init-only的特性,即只能在对象构造期间对属性或索引器元素进行赋值,对象构造完成后,不可以再修改属性或索引器元素的值。

init关键字解决了什么问题

实际上,我个人认为init-only属性和read-only属性差别不大,都具有在对象构造完成后不可以再进行赋值的特性,但某些特定场景下还是各有优劣。它们之间最大的差异是,read-only属性只能在属性定义或构造函数中赋值,而init-only属性除了能在属性定义和构造函数中赋值以外,还能在初始化构造器中赋值。

这一点不同使得,当属性需要由调用者初始化时,init-only属性可能会极大程度地简化代码,这取决于这个类有多少属性需要由调用者来进行初始化。

例如,下面的Person类的Name属性如果需要由调用者初始化,如果使用read-only属性,则可以写成

class Person
{
public Person( string name )
{
Name = name;
} public string Name { get; }
} Person p = new Person("A");

如果写成init-only属性,则可以写成

class Person
{
public string Name { get; init }
} Person p = new Person(){ Name = "A" };

目前看来,init-only属性少写了一个构造函数,但还不具备特别明显的优势。

但是,当类似Name这样的属性变得很多时,如果使用read-only属性,就会使构造函数的参数数量变得非常多,并且,在实际业务中,大部分属性可能允许在对象初始化时保持默认值,这又使得构造函数中的大量参数变成了可选参数,这实在是非常不优雅。这时候,init-only属性就显得非常实用了。

init关键字还存在什么问题

前面对比了init-only属性和read-only属性,并举例说明了init-only属性的一种应用场景,那么下面将举例另一种场景,init-only属性可能不如read-only属性。

前面说了read-only属性如果需要由调用者初始化,则必须通过构造函数的参数暴露出来,这可能是一个劣势,但是当我们希望调用者必须初始化这个属性时,这又成为了一个优势——我们可以要求调用者必须传入相应的参数。

在C#11以前,init-only属性无法强制要求调用者在构造对象时初始化该属性,直到C#11新增了required关键字之后,才可以使用required关键字修饰init-only属性,来强制要求调用者必须初始化该属性

public required string Name { get; init }

其他问题

  1. init访问器本质上还是set访问器的一种,因此,属性不能同时定义init访问和set访问器
  2. init访问器的写法基本上和set访问器一样,也可以有关联的后台字段,也可以使用value表示访问器参数

C#语法: init关键字的更多相关文章

  1. OC2_点语法(属性关键字)

    // // Dog.h // OC2_点语法(属性关键字) // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 zhang ...

  2. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  3. Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)

    今天在编译OpenGL红宝书附带源码中的light.c文件时遇到一个诡异的问题: 如图light .c,在不做任何修改的情况编译OK.然而只要在某些地方写了可执行代码,则会无法通过编译器编译! (这几 ...

  4. Java基础语法(1)-关键字与保留字

    title: Java基础语法(1)-关键字与保留字 blog: CSDN data: Java学习路线及视频 1.关键字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用 ...

  5. Javascript高级程序设计——语法、关键字、保留字、变量、数据类型

    1.了解基本语法,JS大小写区分.注释风格.什么是严格模式等. 2.知道ES3和ES5的关键字和保留字大概有哪些,如果使用关键字会报什么错,使用保留字决定于特定浏览器引擎. 3.全局变量和局部变量的定 ...

  6. Java【第一篇】基本语法之--关键字、标识符、变量

    关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 标识符 Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符凡是自己可以起名字的地 ...

  7. Java 基本语法(关键字、标识符、常量、注释)

    1. Java 程序的构成 对象(object):对象是类的一个实例,有状态和行为. 类(class):类是一个模板,它描述一类对象的行为和状态. 方法(method):方法就是行为,一个类可以有很多 ...

  8. Javascript学习笔记-基本概念-语法、关键字和保留字、变量

    语法 1.区分大小写 2.标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数. 命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($): 其他字符可以是字母.下划线.美元 ...

  9. c基础语法-常用关键字

    变量 在计算机中,整数是以补码形式存放的.所以如果整数的最高位是1,有符号数的话就是负数:如果是无符号数,则都表示正数 整形 int ->32 -2^31~2^31无符号整形 unsigned ...

  10. C语言语法之关键字

    注:该内容整理自以下链接. http://www.cnblogs.com/yezhenhan/archive/2011/10/16/2214420.html 由ANSI标准定义的C语言关键字共32个: ...

随机推荐

  1. api使用流程、Scanner键盘录入字符串

    1.api介绍 2.api使用流程 API帮助文档的使用流程 在索引位置搜索自己要查看的类 看包 目的: 是不是java.lang包(核心包), 不需要编写导包代码(import) - 不是java. ...

  2. 什么是MIME类型-基础知识补全

    MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是一种标准,用于标识互联网上传输的文件类型.它最初是为电子邮件设计的,后来被广泛应用于W ...

  3. 魔百和CM311-1a YST线刷精简固件(可救砖)

    固件说明:1. 魔百和CM311-1a YST测试可用,其它型号自行测试,请慎重使用: 2.支持原装遥控器,语音蓝牙遥控器:3.固件压缩包有刷机教程,请一定仔细阅读. 4.该固件内置应用商店,可以下载 ...

  4. Clion搭建C语言开发环境

    1.下载和安装MinGW 1)下载链接:http://www.mingw.org/ 2)选择安装目录,目录尽可能简单(如:D:\MinGW)且不要包含中文和空格 3)添加相关的包 所需的包如下:min ...

  5. AQS的acquire(int arg) 方法底层源码

    一.定义 acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态.如果当前线程无法获取同步状态,则将其加入等 ...

  6. 华为od机考2025A卷真题 -查找接口成功率最优时间段

    题目描述与示例 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数,给定一 ...

  7. Golang服务可观测和思路分享

    省流 中医四诊"望闻问切"与程序诊断有异曲同工之妙.在Golang问题排查中,我们需要建立系统化的诊断思维:通过观察表象(望).收集信息(闻).追溯根源(问).精准施治(切)四个维 ...

  8. Vue(七)——事件处理

    前情提要: v-on--监听DOM事件,在触发时运行js代码 在内联语句处理器中访问原始的 DOM 事件.可以用特殊变量 $event 把它传入方法 示例: <div id="exam ...

  9. Apache Flink(CVE-2020-17519)路径遍历漏洞复现_附POC和批量检测脚本

    声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...

  10. 提高Flutter应用性能的最佳实践

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...