1. ホーム
  2. Web プログラミング
  3. ASP.NET

NET6新機能 新構造体の最適化

2022-01-13 12:20:12
{NET6では、Struct.Directorにいくつかの最適化が施されています。 NET6はStructのためにいくつかの最適化を行っています。

{NET6 I. レコード構造

の前バージョンでも利用可能でしたが record は、以前のバージョンでは record class は参照型ですが {コード record struct が値型である場合は、構造体である

というように使われます。

record struct Point(int X, int Y);


NET6 に基づいてレコードを宣言することもサポートされています。 class record で新しいオブジェクトを作成するために、== と ! = 演算子をオーバーライドし、いくつかのプロパティを変更することができます。レコード構造体がパラメータ付きコンストラクタを宣言している場合、暗黙のうちにパラメータなしのコンストラクタが生成されます。

コードは以下の通りです。     

record class

上記のコードを実行すると、参照コンストラクトが明示的に宣言されていないにもかかわらず、それを初期化するために参照不要のコンストラクトが生成されていることが分かります。

上記のコードの出力は以下の通りです。

record RecordModel(int Id, string Name) record struct

II. 読み出し専用構造体レコード

を使用することができます。 GetHashCode を使って構造をマークすることもできますし {コード しかし var p1 = new Point(1, 2); var p2 = p with { X = 2 }; Console.WriteLine(p1); Console.WriteLine(p2); Console.WriteLine(new Point()); はrefで変更することはできません。使用方法 Point { X = 1, Y = 2 } Point { X = 2, Y = 2 } Point { X = 0, Y = 0 } 1次コンストラクタで宣言された構造体は、init属性を持つことになります。

readonly

このプロパティは次のように宣言されています。

readonly struct record

III. パラメータレスコンストラクタ

record struct

{{コード コードは以下の通りです。

{{コード
readonly struct record

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; } }

{{コード

{{コード

{{コード NET6 supports user-defined parameterless constructors, and we can add initialization logic to the parameterless constructor The code is as follows. 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}"; } } Here you need to pay attention to default and new The difference between default is the empty state of the structure and does not perform the unrefined construction, the new is executed, and the constructor is also executed when the object is created through reflection. The output of the code is as follows. 1_2_3 0_0_0 1_2_3 In addition to record NET6 also extends the use of with expressions to allow normal structures and anonymous objects to use with to modify some of the properties of The code is as follows. 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 })); The output is as follows. 2_2_3 {"X":1, "Y":1} {"X":3, "Y":3} with can only operate on public members, the Z in the above code is private, so it cannot be specified in the with expression. and record class record struct does not have a Clone method, because struct does not need its own Clone function. record struct Clone member methods are not allowed to be declared, and all records are not allowed to declare Clone members. This is the end of this article on NET6 struct optimization. For more information about NET6 struct optimization, please search the previous articles or continue to browse the following articles. {{コード

{{コード コードは以下の通りです。

{{コード
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

{{コード

{{コード

{{コード default {{コード {{コード

{{コード