• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C#9.0:Init相关总结

c# 搞代码 4年前 (2022-01-09) 22次浏览 已收录 0个评论

背景

在以前的C#版本里面,如果需要定义一个不可修改的的类型的做法一般是:声明为readonly,并设置为只包含get访问器,不包含set访问器。如下:

public class PersonInfo
 {
  /// <summary>
  /// 身份编号
  /// </summary>
  public string UserCode { get; }

  /// <summary>
  /// 姓名
  /// </summary>
  public string UserName { get; }

  /// <summary>
  /// 初始化赋值
  /// </summary>
  /// <param name="_userCode"></param>
  /// <param name="_userName"></param>
  public PersonInfo(string _userCode,string _userName)
  {
   UserCode = _userCode;
   UserName = _userName;
  }
 }

这种方式是可行的,也达到我们的目的,但是代码量多,需要增加额外的构造方法来实现初始化赋值,并且如果字段越多,带参构造函数也会越大,开发工作量也越大,更不好维护。

为了改变这种状态,C#9.0提供了一种解决方案:在对象初始换的时候就配置为只读的方式。

特别对一口气创建含有嵌套结构的树状对象来说更有用。下面是一个用户信息初始化的案例:

PersonInfo pi = new PersonInfo() { UserCode="1234567890", UserName="Brand" }; 

从这个例子说明了,要进行对象初始化,我们必须先要在需要初始化的属性中添加set访问器,然后才能在对象初始化器中通过给属性或者索引器赋值来实现。如下:

public class PersonInfo
 {
  /// <summary>
  /// 身份编号
  /// </summary>
  public string UserCode { get; set; }

  /// <summary>
  /// 姓名
  /// </summary>
  public string UserName { get; set; }
 }

所以对于初始化来说,属性必须是可变的,set访问器就必须存在。这就是问题所在,很多情况下为了避免属性初始化之后再被改变,就需要不可变对象类型,因此setter访问器在这里明显不适用。

基于这种有这种常见的需要和局限性,C#9.0引入了只用来初始化的init设置访问器。这时,上面的PersonInfo类就可以定义成下面的样子:

public class PersonInfo
 {
  /// <summary>
  /// 身份编号
  /// </summary>
  public string? UserCode { get; init; }

  /// <summary>
  /// 姓名
  /// </summary>
  public s<i>本文来源gaodai$ma#com搞$$代**码)网@</i>tring? UserName { get; init; }
 }

这边通过采用init访问器,代码变得简洁易懂了,满足了上面的只读需求,而且更易编码和维护。

定义和使用

init(只初始化属性或索引器访问器):只在对象构造阶段进行初始化时可以用来赋值,算是set访问器的变体,set访问器的位置使用init来替换。init有着如下限制:

1、init访问器只能用在实例属性或索引器中,静态属性或索引器中不可用。

2、属性或索引器不能同时包含init和set两个访问器

3、如果基类的属性有init,那么属性或索引器的所有相关重写,都必须有init。接口也一样。

什么时候设置init访问器

除过在局部方法和lambda表达式中,带有init访问器的属性和索引器可以在下面几种情况中可设置的。这几个设置的时机都是在对象的构造阶段。过了构造阶段,后续赋值操作就不允许了。

1、在对象初始化器工作期间

2、在with表达式初始化器工作期间

3、在所处或者派生的类型的实例构造函数中,在this或者base使用上


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C#9.0:Init相关总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址