rksoftware

Visual Studio とか C# とかが好きです

レコード構造体 (2)

■ C# 10.0 での新機能

・レコード構造体 ( Record structs )
  https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/record-structs
 以前はクラスでしか作れなかったレコードが構造体でも作れるようになった。ただし標準ではプロパティの値が変更可能。readonly にすることで不変に。 == での比較も可能になる。

{ // レコード構造体 (型の定義は末尾)
    SampleRecordStruct sampleRecordStruct = new(1);
    sampleRecordStruct.Value1 = 2;  // 変更可能
}

{ // レコードクラス (以前からの機能) (型の定義は末尾)
    SampleClass sampleClass = new(1);
    // sampleClass.Value1 = 2; これはエラー。レコードクラスは不変
}

{ // 不変のレコード構造体 (型の定義は末尾)
    SampleReadolyStruct sampleReadonlyStruct = new(1);
    // sampleReadonlyStruct.Value1 = 2; これはエラー
}

{ // レコード構造体
    SampleRecordStruct sampleRecordStruct = new(1);
    sampleRecordStruct.Value1 = 2;

    var struct4 = sampleRecordStruct with { Value1 = 2 };

    // ToString の結果は「SampleRecordStruct { Value1 = 2 }」フィールドの値も表示するいい感じの実装
    Console.WriteLine(sampleRecordStruct);
    // == で比較ができる。フィールドの値が同じなら True になる
    Console.WriteLine(sampleRecordStruct == struct4); // True
    // != もできる
    Console.WriteLine(sampleRecordStruct != struct4); // False
}

{ // 構造体
    // 位置指定レコードは通常の構造体では使えない
    SampleStruct sampleStruct = new (){ Value1 = 1 };
    sampleStruct.Value1 = 2;

    // with 式は通常の構造体でも使える
    var struct4 = sampleStruct with { Value1 = 2 };

    // ToString の結果は「SampleStruct」構造体の名前だけの実装
    Console.WriteLine(sampleStruct);
    // == はできない文法エラー
    // Console.WriteLine(sampleStruct == struct4);
}

// 以降、型の定義

// レコード構造体
record struct SampleRecordStruct(int Value1);
// レコードクラス (以前からの機能)
record class SampleClass(int Value1);
// 不変のレコード構造体
readonly record struct SampleReadolyStruct(int Value1);
// 構造体
struct SampleStruct { public int Value1; };