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。例如 re
adonly 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}"; } }
這裡需要註意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 成員。
到此這篇關於 NET6新特新 struct優化的文章就介紹到這瞭,更多相關 NET6 struct優化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C#9特性record 類型、模式匹配、init 屬性詳情
- C#基礎教程之類class與結構struct的區別
- C# Record構造函數的行為更改詳解
- java中的JsonSerializer用法,前後端單位轉換必備
- C#9.0:Init相關總結