.NET6新东西--struct优化

简介: .NET6新东西--struct优化

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


一、Record Struct

虽然在上一个版本中就有了record,但是上一版本中的的record是class是一个引用类型,但是record struct是值类型是一个结构,它的使用方式如下:

record struct Point(int X, int Y);

在.NET6中也支持record来声明一个基于class的record,这和原来的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<Point>
{
  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<Point1>());
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}";
    }
}

这里需要注意default和new的差别,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 成员。


目录
相关文章
|
3月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
96 7
|
6月前
|
存储 C#
C#.Net筑基-类型系统②常见类型--结构体类型Struct
本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。
|
消息中间件 存储 设计模式
.NET-记一次架构优化实战与方案-底层服务优化
.NET-记一次架构优化实战与方案-底层服务优化
127 0
.NET-记一次架构优化实战与方案-底层服务优化
|
SQL 存储 前端开发
.NET-记一次架构优化实战与方案-前端优化
.NET-记一次架构优化实战与方案-前端优化
124 0
.NET-记一次架构优化实战与方案-前端优化
|
前端开发 程序员
.NET-记一次架构优化实战与方案-梳理篇
.NET-记一次架构优化实战与方案-梳理篇
121 0
.NET-记一次架构优化实战与方案-梳理篇
|
消息中间件 缓存 NoSQL
.net core实践系列之短信服务-架构优化(一)
.net core实践系列之短信服务-架构优化(一)
202 0
.net core实践系列之短信服务-架构优化(一)
|
前端开发 程序员
.NET-记一次架构优化实战与方案-目录
.NET-记一次架构优化实战与方案-目录
118 0
|
运维 监控 API
.net core实践系列之短信服务-架构优化(二)
.net core实践系列之短信服务-架构优化(二)
189 0
|
C#
.NET6新东西--插值字符串优化
.NET6新东西--插值字符串优化
250 0
|
监控 Dubbo 搜索推荐
异构(兼容dubbo)SOA系统架构(.net)优化升级
原文:异构(兼容dubbo)SOA系统架构(.net)优化升级 前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来。 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离。
1116 0