C# 9 新特性——init only setter

C# 9 新特性——init only setter

Intro

C# 9 中新支持了 init 关键字,这是一个特殊的 setter,用来指定只能在对象初始化的时候进行赋值,另外支持构造器简化的写法,Target-typed new expression 在已知类型的情况下可以使用 new() 来代表构造方法的简化用法,可以简化字段的声明,也可以简化一次声明多个相同类型的变量

Sample

来看一个示例,我们定义一个测试用的 Person 类,测试代码如下:

public class Person
{public int Age { get; init; }public string Name { get; init; }public string Description { get; set; }public override string ToString(){return $"Name:{Name}(Age:{Age})";}
}

init 是一个特殊的 setter 适用于实例属性,被标记为 init 的属性,只能在实例化的时候通过初始化器来赋值,实例化操作完成后不允许再修改值。

var p1 = new Person()
{Name = "Michael",Age = 10
};
Console.WriteLine(p1);
// compiler error,不能对 init 的字段再赋值
// p1.Age = 12;// Target-Typed new expression, C#9 新特性
Person p2 = new()
{Name = "Jane",Age = 10,
}, p3 = new()
{Name = "Alice"
};
Console.WriteLine(p2);
Console.WriteLine(p3);

init 的等效写法,init 类似于 set ,但是 init 对应的字段会是一个 readonly 的字段,来保证只能在构造器中或者初始化器中被赋值,另外编译器会做检查如果是 init,会有一个特殊的标识,在初始化后再赋值的时候就会报错,类似于下面这样:

internal class TestInitModel
{private readonly string _name;public string Name{get => _name;init => _name = value;}
}

我们以上面的 Person 为例来看一下生成 IL 代码的区别:

可以看到声明为 init 的 属性会比普通的 set 多出来一个修饰符,这是由编译器去生成的,编译器也会根据此去判断是否是在初始化的时候赋值,如果不是就会报错。

序列化是否会有问题呢,我们来测试一下,可以看到 model1 是被正常赋值(这里的 ToJson/JsonToObject是基于 Newtonsoft.JsonJsonConvert 封装的扩展方法)

More

我觉得 init 为我们带来的好处在于,可以在初始化的时候赋值而非直接通过构造器赋值,如果希望一个属性只能 get ,不在初始化之外的地方被赋值,之前我的做法都是在构造器里初始化,只保留一个 getter,没有 setter,有了这个支持之后就可以不需要修改构造方法比较方便的使用了

Reference

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/InitOnlySample.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乔安监控云存储_智能运维丨全栈监控,护航云上业务

自2006年至今,云计算商用领域已经历了十余载的发展。云也从概念普及进入到广泛应用阶段,云服务变成了像水电一样的基础服务,已经是行业共识。云发展速度快、成长空间大,监控场景复杂最新Gartner的报告预测到2019年公有云市场将达到…

阿星Plus:基于abp vNext开源一个博客网站

作为微软最早迈向开源的重要软件之一,.NET 5的发布具有重要意义!微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。这里推荐一个.NET Core 3.1 开源的…

html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了。因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置。当然,前提是你的应用程序有这样的操作权限。首先建立一个main.go文件,作为项…

excel表格中添加combobox_Excel中两个表格对比,找出不同数据

当你有两个Excel工作簿需要对比数据时候,你该怎么做呢?数据少,我们直接用眼睛就可以看到,数据如果太多,那么对比找出不同数据,是一件非常困难的事情。今天,小汪老师就来教大家几招,可…

计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)

前言这篇文章不是讲乐理知识的,那是音乐制作人,编曲人员所需要钻研的学问,不过你要有兴趣也可以看看专业的乐理知识。这里仅仅是说在音乐信号分析的项目中,我们需要知道的一些参数的意义。在诸多信号处理,或图像处理算…

代码改变世界,也改变了我

愿2021的你,可以勇敢的踏出那一步,可以去追求自己想要的东西。脑图版代码版using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp14 {internal class Program{pr…

计算机基础与应用教程计算机硬件,计算机基础系列一:计算机硬件

1、编程语言的作用及与操作系统和硬件的关系一个完整的计算机系统包括硬件、操作系统、软件(即程序员开发的各种软件)三部分组成。各程序员开发的软件若直接调用计算机的硬件,如硬盘读取、音频播放等,则软件不仅编写复杂同时影响开发效率,因此…

宝塔mysql远程链接_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案

错误信息:AH00526: Syntax error on line 54 of /www/server/apache/conf/httpd.conf:Cannot define multiple Listeners on the same IP:port朋友网站突然访问不了,进入宝塔后查看Apache服务器没运行,重启Apache时提示这个错误信息打开Apach…

C#-WinForm跨线程修改UI界面

背景在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间…

长春工业大学计算机科学与技术录取分数,2021年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)...

2018年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)同学们2019年高考是你们人生旅途的第一个加油站,它意味着你们的希望,你们的前途,甚至是命运,挑战六月就是挑战命运和未来,希望你们在高考中脱颖而出&am…

.NET 5 开源工作流框架elsa技术研究

编者注: 工作流框架 elsa 是.NET基金会下面的开源项目,2.0版本即将在3月份发布,目前正在紧锣密鼓的开发之中,2020年2月份我也介绍过推荐一个很棒的开源工作流elsa-core ,今天给大家推荐MVP 周国庆写的这篇详细文章。今…

php 清空一个数组_PHP工程师学Python数据类型

一、背景继上篇文章比较了PHP与Python语法之后,这周又学习了Python数据类型,准备从通过这篇文章给自己进行一些总结,也给其他读者一些参考。二、内容概要字符串(str)列表(list)元组(tup)字典(dict)数据操作三、字符串(str)Python中字符串操作…

“开源、共享、创新” 2020 中国.NET开发者大会小结

大会的新闻稿在2020年12月31日正式发布:开源共享创新|2020年中国.NET开发者大会圆满收官! , 本文是这篇新闻的补充性文章,仅代表个人对大会的各方面分享内容的一个小结。在2019年上海中国.NET开发者大会的基础上,2020年12月19日 继…

maya的颤动怎么做_必看!新手学习MAYA的几个建议

“学习是没有捷径可言的,唯一的捷径就是不断的学习和练习,只有这样才能学到真功夫”Maya设计刚刚开始接触Maya的同学都会有这些疑问,我适不适合学习Maya,学习Maya可以赚到钱吗?怎样才可以学好Maya,今天给大…

我的2020年终总结:新的角色,新的开始

【年终总结】| 作者/Edison Zhou又到了一年一度的年终盘点时刻,熟悉我的朋友应该都知道,这个时候我都会写一篇推文盘点一下这一年来的得失。1也谈2020关键事件回顾(1)扯证了,结婚了要说2020年我个人的最大里程碑&#…

docker es持久化_使用docker数据卷对容器数据持久化

volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。默认容器的数据存储在这里我们在容器中创建一些模拟的…

求职信计算机工程师英语作文,开发工程师英文求职信范文

开发工程师英文求职信范文respected leaders:hello:first salute you sincere thanks, thank you for taking the time to consult the of my application letter!i am aptech a student, now already graduated from junior year. major in.net direction, and ismitted to be…

微信适配国产操作系统:原生支持 Linux

喜欢就关注我们吧!据 ZOL 报道,统信软件官方近日宣布上线适配统信 UOS 的微信桌面客户端,并称该微信版本为原生支持 Linux 的版本,同时支持龙芯、鲲鹏、麒麟等国产 CPU。据悉,统信 UOS 版的微信桌面客户端由腾讯公司研…

ML.NET生成器带来了许多错误修复和增强功能以及新功能

ML.NET是一个开源的跨平台机器学习框架,适合 .NET 开发人员。它允许将机器学习集成到 .NET 应用中,而无需离开 .NET 生态系统,甚至拥有 ML 或数据科学背景。ML.NET工具(Visual Studio 中的 UI 模型生成器和跨平台 ML.NET CLI&…