C#语法: init关键字
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 }
其他问题
- init访问器本质上还是set访问器的一种,因此,属性不能同时定义init访问和set访问器
- init访问器的写法基本上和set访问器一样,也可以有关联的后台字段,也可以使用value表示访问器参数
C#语法: init关键字的更多相关文章
- OC2_点语法(属性关键字)
// // Dog.h // OC2_点语法(属性关键字) // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 zhang ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)
今天在编译OpenGL红宝书附带源码中的light.c文件时遇到一个诡异的问题: 如图light .c,在不做任何修改的情况编译OK.然而只要在某些地方写了可执行代码,则会无法通过编译器编译! (这几 ...
- Java基础语法(1)-关键字与保留字
title: Java基础语法(1)-关键字与保留字 blog: CSDN data: Java学习路线及视频 1.关键字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用 ...
- Javascript高级程序设计——语法、关键字、保留字、变量、数据类型
1.了解基本语法,JS大小写区分.注释风格.什么是严格模式等. 2.知道ES3和ES5的关键字和保留字大概有哪些,如果使用关键字会报什么错,使用保留字决定于特定浏览器引擎. 3.全局变量和局部变量的定 ...
- Java【第一篇】基本语法之--关键字、标识符、变量
关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 标识符 Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符凡是自己可以起名字的地 ...
- Java 基本语法(关键字、标识符、常量、注释)
1. Java 程序的构成 对象(object):对象是类的一个实例,有状态和行为. 类(class):类是一个模板,它描述一类对象的行为和状态. 方法(method):方法就是行为,一个类可以有很多 ...
- Javascript学习笔记-基本概念-语法、关键字和保留字、变量
语法 1.区分大小写 2.标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数. 命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($): 其他字符可以是字母.下划线.美元 ...
- c基础语法-常用关键字
变量 在计算机中,整数是以补码形式存放的.所以如果整数的最高位是1,有符号数的话就是负数:如果是无符号数,则都表示正数 整形 int ->32 -2^31~2^31无符号整形 unsigned ...
- C语言语法之关键字
注:该内容整理自以下链接. http://www.cnblogs.com/yezhenhan/archive/2011/10/16/2214420.html 由ANSI标准定义的C语言关键字共32个: ...
随机推荐
- thinkphp6 使用自定义命令,生成数据库视图
在 ThinkPHP 命令行工具中,你可以为选项设置 别名,通过为选项指定一个简短的别名来简化命令输入.例如,如果你希望 --force-recreate 选项有一个简短的别名 -f,你可以通过在 a ...
- firedac的性能
应该说,目前10.3的方方面面基本正常的坑基本填好了.因此综合考虑还是用datasanp+firedac框架操练. ================================ 数据量2w行,字段 ...
- TM1637读取键值调试笔记
因为项目原因需要用到TM1637,实现驱动数码管和按键扫描,参考了网络上搜索到的一些例程,基本实现了功能要求,能够实现数码管点亮和按键扫描. 调试过程中也出现一些问题,现在描述一下问题和解决方 ...
- eolinker脚本代码[Javascript]:通过判断返回码决定是否中止执行脚本
场景描述: 请求返回码(code)不等于0时,整个脚本停止执行,并抛出信息 具体脚本: if (JSON.parse(result_api_1.response).Code != "0&qu ...
- Quill自定义插入视频video实例
import Quill from 'quill' const BlockEmbed = Quill.import('blots/block/embed') class VideoBlot exten ...
- [开源] Layouter(桌面助手)开源发布
Layouter(桌面助手)是一款简洁.易用.美观的桌面整理软件,基于.net 6开发,支持Windows 7及以上操作系统.以 Apache-2.0 license 进行开源. 开源地址 https ...
- 获取IP地址避免XFF攻击(使用nginx)
//以下代码可以获取到客户端IP,但是可能会有XFF攻击,伪造IP地址 request.getHeader("x-forwarded-for"); 解决办法 //从Nginx中X- ...
- [数据库/SQL] 浅谈DDL、DSL、DCL、DML、DQL
概念辨析:SQL.DQL.DML.DDL.DCL SQL(Structure Query Language, 结构化查询语言)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下 ...
- Ubuntu 中通过源码安装 Python3.x 环境
最近在个人前后端分离项目时候, 后端接口程序 fastapi, 在部署的时候, 需要 Pyhton3.8 以上的环境, 但 ubuntu 默认的是 2.7 于是想通过源码安装的方式进行环境搭建. 下载 ...
- C#中的i++,++i,i--,--i
这些是 C# 中用于增加和减少变量值的运算符,下面是它们的用法: 1.i++ (后增量运算符):先使用变量 i 的当前值,然后将 i 的值加 1. int i = 0; int j = i++; // ...