rksoftware

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

レコード構造体 ( Record structs ) - C# 2.0 以降の新機能まとめ (C# 10.0 ~ ) (途中)

 C# 10.0 の新機能の名前と公式ガイドページへのリンクをまとめています。(途中)

 注1)機能の名前はできるだけ公式ガイドから言葉を拾うようにしましたが、完全ではありません。
 注2)リンク先ページはできるだけ日本語ページを拾うようにしましたが、見つけられずに英語のページもあります。
 注3)良さそうなページを探しましたが、もっと良いページがあるかもしれません。

■ C# 10.0 での新機能

・レコード構造体 ( Record structs )
  https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/types/records#how-records-differ-from-classes-and-structs
 以前はクラスでしか作れなかったレコードが構造体でも作れるようになった。ただし標準ではプロパティの値が変更可能。readonly にすることで不変に。 == での比較も可能になる。

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

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

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

{ // レコード構造体の ToString() や == の実装の確認
    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
}

{ // 通常の構造体では ToString() はいまいち。== もできない
    // 位置指定レコードは通常の構造体では使えない
    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; };

■ 出典/参考文献

 上記まとめの作成に、次のサイトを大いに参考にさせていただきました。
 文言やサンプルコードは C# のガイド のコードを利用させていただきました。

C# のガイド | Microsoft Docs