NET6新特新 struct优化

目录
  • 一、Record Struct
  • 二、readonly struct record
  • 三、Parameterless Constructor

在.NET6中针对Struct做了一些优化,下面我们就通过一些案例来看一下.NET6中针对Struct的优化。

一、Record Struct

虽然在上一个版本中就有了record,但是上一版本中的的recordclass是一个引用类型,但是record struct是值类型是一个结构,

它的使用方式如下:

record struct Point(int X, int Y);

.NET6中也支持record来声明一个基于classrecord,这和原来的record是一样的,例如​ ​record class RecordModel(int Id, string Name) ​​`​ ​这和 ​​`​ ​record RecordModel(int Id, string Name)​​ record struct会自动生成Equals和GetHashCode并重写==和!=操作符,并且可以用with修改部分属性创建新的对象。如果record struct声明有参数构造器,则会生成一个隐式的无参构造。

代码如下:     

var p1 = new Point(1, 2);

var p2 = p with { X = 2 };

Console.WriteLine(p1);

Console.WriteLine(p2);

Console.WriteLine(new Point());

运行上述代码可以看到即使没有显式声明无参构造还是会生成一个无参构造来初始化。

上述代码输出如下:

Point { X = 1, Y = 2 }

Point { X = 2, Y = 2 }

Point { X = 0, Y = 0 }

二、readonly struct record

我们可以使用readonly来标记结构体,也可以使用readonly struct record,但record struct不能使用ref修饰。使用readonly struct record声明的结构体,如果使用Primary Constructor对应的属性会是init。例如​ ​readonly record struct Point(int X, int Y);​​

属性的声明是这样的:

internal readonly struct Point : IEquatable

{

  public int X { get; init; }

  public int Y { get; init; }

  public Point(int X, int Y)

  {

  this.X = X;

  this.Y = Y;

  }

}

三、Parameterless Constructor

.NET6支持用户自定义无参构造方法,我们可以在无参构造方法中加入初始化逻辑,

代码如下如下:

Console.WriteLine(new Point1().ToString());

Console.WriteLine(default(Point1).ToString());

Console.WriteLine(Activator.CreateInstance());

struct Point1

{

    public int X { get; set; }

    public int Y { get; set; }

    private int Z { get; set; }

    public Point1()

    {

        X = 1;

        Y = 2;

        Z = 3;

    }

    public override string ToString()

    {

        return $"{X}_{Y}_{Z}";

    }

}

这里需要注意defaultnew的差别,default是结构体空状态,不会执行无参构造,new是会执行,通过反射创建对象的时候也会执行构造,

代码输出结果如下:

1_2_3

0_0_0

1_2_3

除了record之外,.NET6还扩展了with表达式用法,普通结构体和匿名对象也可以使用with来修改部分属性

代码如下:

Console.WriteLine((new Point1() with { X = 2 }).ToString());

Console.WriteLine();

var obj = new

{

    X = 1,

    Y = 1

};

Console.WriteLine(JsonSerializer.Serialize(obj));

Console.WriteLine(JsonSerializer.Serialize(obj with { X = 3, Y = 3 }));

输出结果如下:

2_2_3

{"X":1,"Y":1}

{"X":3,"Y":3}

with只能对public成员进行操作,上面代码中的Z是private,因此在with表达式中是不能指定。 和record class相比record struct没有 Clone 方法,因为struct不需要自带Clone功能,record struct不允许声明Clone成员方法,所有record都不允许声明Clone 成员。

到此这篇关于 NET6新特新 struct优化的文章就介绍到这了,更多相关 NET6 struct优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层

    本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层.Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repository数据持久层.本篇文章通过使用StructureMap依赖注入使Controller,Service,Repository三层的耦合度降到最低. 本系统使用NorthWind开源数据,

  • NET6新特新 struct优化

    目录 一.Record Struct 二.readonly struct record 三.Parameterless Constructor 在.NET6中针对Struct做了一些优化,下面我们就通过一些案例来看一下.NET6中针对Struct的优化. 一.Record Struct 虽然在上一个版本中就有了record,但是上一版本中的的record是class是一个引用类型,但是record struct是值类型是一个结构, 它的使用方式如下: record struct Point(in

  • .NET6新特新 struct优化

    目录 一.Record Struct 二.readonly struct record 三.Parameterless Constructor 在.NET6中针对Struct做了一些优化,下面我们就通过一些案例来看一下.NET6中针对Struct的优化. 一.Record Struct 虽然在上一个版本中就有了record,但是上一版本中的的record是class是一个引用类型,但是record struct是值类型是一个结构, 它的使用方式如下: record struct Point(in

  • 详解简单高效的Go struct优化

    目录 前言 先来看个例子 内存对齐机制 案例进一步分析 总结 前言 结构体的定义,大家都很熟悉,但想要定义出更节省内存空间的结构体,可不是一件简单的事. 我们必须掌握了Go的结构体内存对齐机制,才能做出相应的优化(节省内存并提高性能). 先来看个例子 下面定义两个结构体,字段都一样,只是部分字段稍微调整了一下顺序. 但输出的结果,为什么bad占用24字节,而good却只占用16字节呢?一个顺序调整就节省了8个字节,太神奇了 type BadSt struct { A int32 B int64

  • 浅谈php7的重大新特性

    截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了.后续一些版本的迭代主要也就是修修bug,优化之类的.下面就来说话我们一直期待的php7会有那些主要的变化了... 新特性预览 ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG 增加抽象语法树,使编译更加科学 64位的INT支持 统一的变量语法 原声的TLS - 对扩展开发有意义 一致性foreach循环的改进 新增

  • 你应该知道的Python3.6、3.7、3.8新特性小结

    很多人在学习了基本的Python语言知识后,就转入应用阶段了,后期很少对语言本身的新变化.新内容进行跟踪学习和知识更新,甚至连已经发布了好几年的Python3.6的新特性都缺乏了解. 本文列举了Python3.6.3.7.3.8三个版本的新特性,学习它们有助于提高对Python的了解,跟上最新的潮流. 一.Python3.6新特性 1.新的格式化字符串方式 新的格式化字符串方式,即在普通字符串前添加 f 或 F 前缀,其效果类似于str.format().比如 name = "red"

  • 使用“新网”接口的用户注意问题

    经过我们了解,新网近期会从2008年8月至9月对域名接口进行升级,为了不影响用户的正常的运营和帮助用户解决这个问题,星外的开发部已经将[星外虚拟主机管理平台]主控端升级到最新版本,用户只要按照下面的的操作办法,就可以成功注册域名. 具体的升级流程如下: 1.请联系"新网"主动升级域名接口,新网会为您提供升级服务. 注意:新网通知您升级成功以后,您需要到新网的代理区 http://agent.xinnet.com设置好域名接口和IP密码,并且,接口 密码应该和旧接口的密码一样新的接口才可

  • Javascript仿新浪游戏频道鼠标悬停显示子菜单效果

    本文实例讲述了Javascript仿新浪游戏频道鼠标悬停显示子菜单效果,分享给大家供大家参考.具体如下: 这里演示使用JS实现的网页栏目分类菜单,从新浪游戏频道扣下来的,操作方式类似于滑动门的效果,鼠标无需点击,只需把鼠标放在一级主菜单上,就可显示出二级分类菜单,这弹出的这个二级菜单中,实际上又重新进行了分类,可以说整体上,这是一款支持三级分类的网站菜单,目前新浪游戏还在用的效果哦. 先来看运行效果截图: 在线演示地址如下: http://demo.jb51.net/js/2015/js-gam

  • jQuery 3.0十大新特性最终版发布

    jQuery 3.0 最终版发布了.jQuery 3.0将是jQuery的未来.但如果你需要IE6-8支持,您可以继续使用最新版本1.12. jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终版www.lampbrother.net. 通过jQuery 3.0的版本更新说明,我们看到了一个保持着向后兼容的更轻便,更快速的jQuery.在本文中,我们将

  • 解析如何用SQL语句在指定字段前面插入新的字段

    create proc addcolumn@tablename varchar(30), --表名@colname varchar(30), --要加的列名@coltype varchar(100), --要加的列类型@colid int --加到第几列as declare @colid_max intdeclare @sql varchar(1000) --动态sql语句--------------------------------------------------if not exist

  • jQuery 3.0十大新特性

    jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终版. 通过jQuery 3.0的版本更新说明 ,我们看到了一个保持着向后兼容的更轻便,更快速的jQuery.在本文中,我们将介绍一些令人眼前一亮的jQuery 3.0全新特性. 开始前的说明 如果你想要下载jQuery 3.0进行亲自实验,可以通过 该页面 进行下载.另外, 升级指南 和 源代码 也值

随机推荐