溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

NET6中truct優(yōu)化怎么用

發(fā)布時(shí)間:2021-11-22 13:34:04 來源:億速云 閱讀:177 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“NET6中truct優(yōu)化怎么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“NET6中truct優(yōu)化怎么用”這篇文章吧。

一、Record Struct

雖然在上一個(gè)版本中就有了record,但是上一版本中的的recordclass是一個(gè)引用類型,但是record struct是值類型是一個(gè)結(jié)構(gòu),

它的使用方式如下:

record struct Point(int X, int Y);

.NET6中也支持record來聲明一個(gè)基于classrecord,這和原來的record是一樣的,例如 record class RecordModel(int Id, string Name) ` 這和 ` record RecordModel(int Id, string Name) record struct會(huì)自動(dòng)生成Equals和GetHashCode并重寫==和!=操作符,并且可以用with修改部分屬性創(chuàng)建新的對(duì)象。如果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對(duì)應(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}";

    }

}

這里需要注意defaultnew的差別,default是結(jié)構(gòu)體空狀態(tài),不會(huì)執(zhí)行無參構(gòu)造,new是會(huì)執(zhí)行,通過反射創(chuàng)建對(duì)象的時(shí)候也會(huì)執(zhí)行構(gòu)造,

代碼輸出結(jié)果如下:

1_2_3

0_0_0

1_2_3

除了record之外,.NET6還擴(kuò)展了with表達(dá)式用法,普通結(jié)構(gòu)體和匿名對(duì)象也可以使用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只能對(duì)public成員進(jìn)行操作,上面代碼中的Z是private,因此在with表達(dá)式中是不能指定。 和record class相比record struct沒有 Clone 方法,因?yàn)閟truct不需要自帶Clone功能,record struct不允許聲明Clone成員方法,所有record都不允許聲明Clone 成員。

以上是“NET6中truct優(yōu)化怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI