Csharp/C#教程:浅谈C# 9.0 新特性之只读属性和记录分享

大家好,这是C#9.0新特性系列的第4篇文章。

熟悉函数式编程的童鞋一定对“只读”这个词不陌生。为了保证代码块自身的“纯洁”,函数式编程是不能随便“弄脏”外来事物(参数、变量等)的,所以“只读”对函数式编程非常重要。

为了丰富C#对函数式编程支持,较新的C#版本引入了一些很有用的新特性。比如C#8中就对struct类型的方法增加了readonly修饰符支持,被readonly修饰的方法是不能修改该方法所在类的属性的。举个例子:

publicstructFooValue { privateintA{get;set;} publicreadonlyintIncreaseA() { A=A+1;//报错 returnA; } }

而C#9又进一步增加了对“只读”的支持,此次增加了init-only属性和record相关特性,下面一一介绍。

Init-only属性

我们知道类的属性有set和get两种访问器,现在C#9增加一种属性访问器:init。init是set访问器的变体,它的作用是使属性只能在对象初始化的时候对其赋值,之后该属性就是只读的,因此叫init-only属性。使用方式如下:

publicclassFoo { publicstringPropA{get;init;} publicstringPropB{get;init;} }

赋值操作:

varfoo=newFoo{PropA="A",PropB="B"}; foo.PropA="AA";//报错,PropA此时是只读的!

由于init是在初始化阶段赋值,所以它可以在类内部修改readonly修饰的字段。比如:

publicclassFoo { privatereadonlystringpropA; privatereadonlystringpropB; publicstringPropA { get=>propA; init=>propA=(value??thrownewArgumentNullException(nameof(propA))); } publicstringPropA { get=>propB; init=>propB=(value??thrownewArgumentNullException(nameof(propB))); } }

如果你知道在构造函数中可以对只读字段/属性赋值就自然也理解这一点。

记录(Record)

做过财务系统的人都知道交易记录一旦入账是不能修改的,如果录入错误,就要新录入一笔负的记录把之前的红冲掉,再录入正确的记录。应对类似这种只读记录的场景,C#9引入了Record(记录,下文均使用中文的“记录”)的概念,它用来支持整个对象的只读特性(即实例化后为只读)。使用方式如下:

publicdataclassFoo { publicstringPropA{get;init;} publicstringPropB{get;init;} }

这里用了一个data关键字,表示该类的对象只是纯粹的记录值,它不是可修改的状态(在函数式编程中,所有的数据修改都是状态在发生变化)。

上面的太麻烦了,可以这样简写:

publicdataclassFoo { stringPropA; stringPropB; }

默认属性都是public的,如果实在要改为private,可以在属性定义前面加上private修饰符。

定位记录(PositionalRecord)

有时候为了初始化更方便,可以定义构造函数来给属性赋值,初始化时只需要把属性值按顺序传给构造函数即可,这个操作称为定位构造(PositionalConstruction)。同样,也可以使用解构函数(Deconstructor)来实现属性的解构,即按照解构函数的参数顺序从对象中提取属性的值,被称为定位解构(PositionalDeconstructor)。实现了定位构造或定位解构的记录称为定位记录(PositionalRecord)。下面是一个定位记录的实现:

publicdataclassFoo { stringPropA; stringPropB; publicFoo(stringpropA,stringpropB) =>(PropA,PropB)=(propA,propB); publicvoidDeconstruct(outstringpropA,outstringpropB) =>(propA,propB)=(PropA,PropB); }

这个写法太麻烦了,可以直接简写为:

publicdataclassFoo(stringPropA,stringPropB);

这样简短一句代码,其内部默认实现了init-only自动属性,且同时为所有属性定义了构造函数和解构函数。

使用示例:

varfoo=newFoo("AA","BB");//构造定位 var(a,b)=foo;//解构定位

可以想象,记录的大部分使用场景,上述就是C#学习教程:浅谈C# 9.0 新特性之只读属性和记录分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/903793.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐