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. Quartz.NET - 教程 2: 作业和触发器

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 2: Jobs And Triggers Quartz API Quartz API 的主要接口和类如下: ISched ...

  2. SQL SERVER日常运维巡检系列之-实例级参数

    前言 做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期.结果进行登记,同时可能需要出一份巡检报告. 本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻 ...

  3. Model接口

    /** * Model接口 * 作用:将值存放到request对象 * * * @return */ @RequestMapping(value = "/testModle") p ...

  4. java——文件的上传、下载、删除操作DEMO

    记录一下java实现文件的上传.下载.删除的功能demo: /** * Controller */ @Slf4j @RestController @RequestMapping public clas ...

  5. termux安装vim

    pkg install vim 解决乱码问题 在家⽬录( ~ )下,新建 .vimrc ⽂件 vim .vimrc 添加内容如下: set fileencodings=utf-8,gb2312,gb1 ...

  6. 【记录】Excel 2021|(三)VBA使用Selenium自动登录网页

    文章目录 1 安装 Selenium Basic 2 下载webdriver 3 自动登录 1 安装 Selenium Basic 首先需要安装Selenium Basic,才能在工具栏中找到Sele ...

  7. 基于ThinkPHP5知识付费系统AntPayCMS

    历时6个月开发基于ThinkPHP5.1知识付费系统AntPayCMS,自己作IT开发已经10年,一直想自己开发自己的系统,虽然看网上也有很多知识付费类的网站的,但基于TP基本很少,而且自己也一直想做 ...

  8. 卷积神经网络 CNN BP算法推导

    重点在对CNN的理解后, 理解对卷积层的的 梯度(导数) 推演. 回顾 CNN 首先是对神经网络, 前向, 后向的基本认识. 神经网络初步认识来看, 跟传统的 ML 理论的区别在于, 它更像一个经验的 ...

  9. B1086 就不告诉你

    描述 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三."本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积. ...

  10. codeup之进制转换(大数的进制转换

    题目描述 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入 多组数据,每行为一个长度不超过30位的十进制非负整数. (注意是10进制数字的个数可能有30个,而非30bits的整数) ...