.NET6新特新?struct优化

 更新时间:2021-12-17 12:01:55   作者:佚名   我要评论(0)

目录一、Record Struct二、readonly struct record三、Parameterless Constructor
在.NET6中针对Struct做了一些优化,下面我们就通过一些案例

在.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优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • .NET?6线程池ThreadPool实现概述
  • .NET?6全新配置对象ConfigurationManager介绍
  • .NET6新特性之 隐式命名空间引用
  • .net 6精简版webapi教程及热重载、代码自动反编译演示

相关文章

  • .NET6新特新?struct优化

    .NET6新特新?struct优化

    目录一、Record Struct二、readonly struct record三、Parameterless Constructor 在.NET6中针对Struct做了一些优化,下面我们就通过一些案例
    2021-12-17
  • Vue?element树形控件添加虚线详解

    Vue?element树形控件添加虚线详解

    目录1.实现效果2.实现代码3.其他实现总结1.实现效果 2.实现代码 树形控件虚线的添加主要通过控制css来实现,并且在树形控件的缩进数只能为0
    2021-12-17
  • 微信小程序通过uni-app进行全局分享

    微信小程序通过uni-app进行全局分享

    实际使用中,经常需要小程序分享到好友或者朋友圈,一般而言是一个个页面去设置。 官网分享介绍:https://uniapp.dcloud.io/api/plugins/sha
    2021-12-17
  • jQuery实现Ajax聊天机器人完成案例

    jQuery实现Ajax聊天机器人完成案例

    聊天机器人可以省掉很多人工方面的问题,在很多时候都可以用到,例如客服,天气回复等问题,本文就详细的介绍一下jQuery Ajax聊天机器人,具
    2021-12-17
  • .NET?Core?中对象池?Object?Pool的使用

    .NET?Core?中对象池?Object?Pool的使用

    目录一、什么是对象池二、.NET Core 中的对象池三、本文小结一、什么是对象池 对象池简单来说就是一种为对象提供可复用能力的软件设计思路。
    2021-12-17
  • vue通过element树形控件实现树形表格

    vue通过element树形控件实现树形表格

    目录实现效果图安装依赖自定义树形控件其他实现总结在vue中通过element树形控件来实现树形表格的效果 通过缩进来实现近似树形表格的效果 实现
    2021-12-17
  • 手把手教你搭建vue3.0项目架构

    手把手教你搭建vue3.0项目架构

    目录前言:一、用 vue-cli 创建项目二、安装路由三、完善目录结构,创建配置文件vue.config.js四、安装ant-design-vue,安装less、安装dayjs
    2021-12-17
  • vue全局引入scss(mixin)

    vue全局引入scss(mixin)

    目录1、mixin.scss2、单文件使用3、全局挂载3.1 导入依赖3.2 重启项目 我们在写VUE的时候,会使用scss,也会做一些通用样式,方便使用,在写
    2021-12-17
  • .NET多种数据库大数据批量插入、更新(支持SqlServer、MySql、PgSql和Oracle)

    .NET多种数据库大数据批量插入、更新(支持SqlServer、MySql、PgSql和Oracle)

    目录功能介绍 (需要版本5.0.45)功能用法数据库支持性能测试使用疑问老版本源码下载:功能介绍 (需要版本5.0.45) 大数据操作ORM性能瓶颈在实体
    2021-12-17
  • vue网络请求方案原生网络请求和js网络请求库

    vue网络请求方案原生网络请求和js网络请求库

    一、?原生网络请求 1. XMLHttpRequest(w3c标准)? ? // 没有promise时的产物 当时的万物皆回调,太麻烦 2. Fetch? ? // html5提供的对象,基
    2021-12-17

最新评论