.NET6新特新?struct優(yōu)化
在.NET6中針對Struct做了一些優(yōu)化,下面我們就通過一些案例來看一下.NET6中針對Struct的優(yōu)化。
一、Record Struct
雖然在上一個(gè)版本中就有了record,但是上一版本中的的record是class是一個(gè)引用類型,但是record struct是值類型是一個(gè)結(jié)構(gòu),
它的使用方式如下:
record struct Point(int X, int Y);
在.NET6中也支持record來聲明一個(gè)基于class的record,這和原來的record是一樣的,例如? ?record class RecordModel(int Id, string Name) ??`? ?這和 ??`? ?record RecordModel(int Id, string Name)?? record struct會(huì)自動(dòng)生成Equals和GetHashCode并重寫==和!=操作符,并且可以用with修改部分屬性創(chuàng)建新的對象。如果record struct聲明有參數(shù)構(gòu)造器,則會(huì)生成一個(gè)隱式的無參構(gòu)造。
代碼如下:? ? ?
var p1 = new Point(1, 2);
var p2 = p with { X = 2 };
Console.WriteLine(p1);
Console.WriteLine(p2);
Console.WriteLine(new Point());
運(yùn)行上述代碼可以看到即使沒有顯式聲明無參構(gòu)造還是會(huì)生成一個(gè)無參構(gòu)造來初始化。
上述代碼輸出如下:
Point { X = 1, Y = 2 }
Point { X = 2, Y = 2 }
Point { X = 0, Y = 0 }
二、readonly struct record
我們可以使用readonly來標(biāo)記結(jié)構(gòu)體,也可以使用readonly struct record,但record struct不能使用ref修飾。使用readonly struct record聲明的結(jié)構(gòu)體,如果使用Primary Constructor對應(yīng)的屬性會(huì)是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支持用戶自定義無參構(gòu)造方法,我們可以在無參構(gòu)造方法中加入初始化邏輯,
代碼如下如下:
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是結(jié)構(gòu)體空狀態(tài),不會(huì)執(zhí)行無參構(gòu)造,new是會(huì)執(zhí)行,通過反射創(chuàng)建對象的時(shí)候也會(huì)執(zhí)行構(gòu)造,
代碼輸出結(jié)果如下:
1_2_3
0_0_0
1_2_3
除了record之外,.NET6還擴(kuò)展了with表達(dá)式用法,普通結(jié)構(gòu)體和匿名對象也可以使用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 }));
輸出結(jié)果如下:
2_2_3
{"X":1,"Y":1}
{"X":3,"Y":3}
with只能對public成員進(jìn)行操作,上面代碼中的Z是private,因此在with表達(dá)式中是不能指定。 和record class相比record struct沒有 Clone 方法,因?yàn)閟truct不需要自帶Clone功能,record struct不允許聲明Clone成員方法,所有record都不允許聲明Clone 成員。
到此這篇關(guān)于 NET6新特新 struct優(yōu)化的文章就介紹到這了,更多相關(guān) NET6 struct優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在 ASP.NET Core 中自動(dòng)啟用 CAP 事務(wù)詳情
本篇文章旨在描述如何在 ASP.NET Core項(xiàng)目中并以一種簡便的方式啟用CAP事務(wù),因?yàn)樵谖覀兊氖纠卸际侵苯友菔颈容^直觀的方式,沒有進(jìn)行封裝,有些初學(xué)者同學(xué)不太會(huì),找到問我如何封裝,本篇文章主要基于 Entity Framework 來進(jìn)行演示2021-10-10
使用.NET6實(shí)現(xiàn)動(dòng)態(tài)API
本文詳細(xì)講解了使用.NET6實(shí)現(xiàn)動(dòng)態(tài)API,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
HttpResponse的Output與OutputStream、Filter關(guān)系與區(qū)別介紹
在網(wǎng)上經(jīng)??匆娪羞@樣的代碼HttpResponse response = HttpContext.Current.Response;現(xiàn)在我也來說說這幾個(gè)東東是什么吧2012-11-11
ASP.NET MVC Web API HttpClient簡介
依稀還記得那個(gè)時(shí)候用WebClient,HttpWebRequest來發(fā)送一個(gè)請求,現(xiàn)在ASP.NET MVC4中自帶了一個(gè)類HttpClient;需要的朋友可以參考下2012-11-11
ASP.NET Core如何注入多個(gè)服務(wù)實(shí)現(xiàn)類
這篇文章主要介紹了ASP.NET Core如何注入多個(gè)服務(wù)實(shí)現(xiàn)類的相關(guān)資料,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
ASP.NET webUploader上傳大視頻文件相關(guān)web.config配置
本文主要介紹了webUploader上傳大視頻文件相關(guān)web.config的配置。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
.NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程
這篇文章主要介紹了.NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

