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