ひでぼ~blog

C#ときどきゲーム

C#のrecordとclassとstructを比較した

C#9から登場したrecordで型が定義できるようになって、record、class、structなどよく分からなくなってきたので、いろいろ比較しつつ整理してみました。

class struct record
参照型 or 値型 参照型 値型 参照型
継承 できる できない できる
Equals() 参照先の比較 メンバの比較 メンバ、型の比較
ToString() 型名を表示 型名を表示 プロパティ一覧を表示

Equals()

recordのEquals()はメンバの比較に加えて型も比較しています。

recordで型を2つ定義し、各インスタンスをEquals()で比較してみました。 片方は継承をしていて、メンバは同じにしてあります。

record RecordBook(int Id, string Name);

record RecordTravelBook(int Id, string Name) : RecordBook(Id, Name);
var book1 = new RecordBook(1, "東海ウォーカー");
var book2 = new RecordTravelBook(1, "東海ウォーカー");
Console.WriteLine(book1 == book2); // False

この場合はメンバの値は同じだけど型が違うのでFalseになりました。

ToString()

recordのToString()はいい感じにプロパティ一覧を表示してくれました。

var book1 = new RecordBook { Id = 1, Name = "ファミ通" };
var book2 = new RecordTravelBook { Id = 2, Name = "東海ウォーカー", Area = "東海" };
Console.WriteLine(book1.ToString());
Console.WriteLine(book2.ToString());

f:id:hideb3:20201231103431p:plain

参考

docs.microsoft.com

ufcpp.net