Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Records en .Net

2026年09月05日に「Dev.to」が公開したITニュース「Records en .Net」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

C#の`record`は、データ専用のクラスのようなもので、バージョン9から導入された。一度作ると内容が変更できない「不変」なオブジェクトを簡単に定義でき、値で比較できるのが特徴だ。コードを減らし、テストを楽にするメリットがあり、特に不変データモデルに役立つ。

出典: Records en .Net | Dev.to公開日:

ITニュース解説

C# 9で導入された「Record(レコード)」は、システム開発においてデータを取り扱う新しい方法を提供する。これは、従来の「Class(クラス)」とは異なる特性を持つ参照型で、特に不変なデータモデルを簡潔に定義することを目的としている。Recordは2020年のリリースから4年が経過したが、その利便性にもかかわらず、まだ多くのプロジェクトでその利用が広まっているとは言えない状況だ。しかし、このRecordを理解し活用することで、コードの品質と開発効率を大きく向上させる可能性がある。

Recordの最大の特長の一つは、その「不変性」にある。従来のクラスは、一度オブジェクトが作成された後でも、そのプロパティの値を自由に変更できる「可変(ミュータブル)」が初期設定となっている。例えば、人の名前や年齢を保持するクラスのオブジェクトを作成した後でも、その人の名前や年齢を後から変更することが可能だ。しかし、Recordは「不変(イミュータブル)」が初期設定であり、プロパティの値をオブジェクトの初期化時に一度だけ設定すると、それ以降は変更することができなくなる。この不変性は、プログラムの安全性を高める上で非常に重要である。なぜなら、オブジェクトが一度作成されたらその状態が保証されるため、予期せぬ場所でデータが変更されてしまうというバグのリスクを減らすことができるからだ。特に複数の処理が並行して動くような複雑なシステムでは、データの変更を心配することなくオブジェクトを安全に受け渡しできるため、プログラマの負担を大きく軽減する。

もう一つの重要な特長は、「値ベースの等価性」である。これは、二つのRecordオブジェクトが「等しい」と判断される基準が、従来のクラスとは異なることを意味する。クラスの場合、二つのオブジェクトが等しいと判断されるのは、通常、それらがメモリ上の同じ場所を指している(同じ参照を持っている)場合だ。たとえ、全く同じ名前と年齢を持つ二つの人のクラスオブジェクトがあったとしても、それぞれが別々に作成されたものであれば、プログラム上は異なるオブジェクトと判断されるのが一般的である。しかし、Recordの場合、プロパティに保持されている「値」が全て同じであれば、二つのRecordオブジェクトは等しいと判断される。これは、例えば「名前が『山田』で年齢が『30』の人物」というデータが二つ存在する場合、それがどこで作成されたかにかかわらず、Recordであれば同じものとして扱えるということを意味する。この特性は、特にシステムテストを行う際に非常に役立つ。テストにおいて、ある処理の結果として得られたオブジェクトが、期待通りの値を持っているかを簡単に確認できるため、手動でEqualsメソッドやGetHashCodeメソッドを実装する手間が省け、テストコードをより簡潔に記述できるようになる。従来のクラスでこれを行うには、これらのメソッドを自分で定義する必要があり、それは冗長なコードとなりがちだった。

Recordはまた、コードの記述量を大幅に削減する。従来のクラスで、複数のプロパティを持つ不変なオブジェクトを作成しようとすると、プロパティの定義、コンストラクタ、そして前述のEqualsやGetHashCodeメソッドの実装など、かなりの量の定型的なコードを書く必要があった。これは特にプロパティの数が多い場合に、非常に手間がかかり、コードが読みにくくなる原因ともなった。しかし、Recordでは、これらの多くが自動的に生成されるため、開発者は必要な情報を一行で簡潔に定義できる。例えば、名前、苗字、住所、年齢、性別といった情報を保持するPerson Recordは、次のように非常にシンプルに定義できる。public record Person(string Nombre, string Apeliido, string Direccion, int Edad, string Sexo); この一行で、不変なプロパティ、適切なコンストラクタ、そして値ベースの等価性比較のためのメソッドが全て提供されるのだ。

さらに、Recordは単なるデータ保持のための型に留まらない。プロパティに値を設定する際に、何らかの「バリデーション(検証)」ロジックを追加することも可能である。例えば、Person RecordのNombre(名前)プロパティに、文字列の長さが10文字を超える場合はエラーを発生させるというような制約を設けることができる。これは、Recordの定義内でプライベートなフィールドとプロパティのinitアクセサ、そして検証用のメソッドを組み合わせることで実現できる。この方法により、オブジェクトが不変であるという基本原則を保ちながら、作成されるデータの整合性を保証するためのビジネスロジックを組み込むことが可能となる。このような柔軟性は、Recordを単なる「データクラス」以上のものにし、例えば「値オブジェクト(Value Object)」のような概念を表現するのに適している。

では、Recordは常にクラスの代わりとして使うべきなのだろうか。答えは「いいえ」である。Recordは確かに多くの利点を持つが、万能ではない。その真価を発揮するのは、主に「不変なオブジェクト」を扱いたい場合だ。データが一度設定されたら変更されないことが望ましい場合、Recordは非常に強力なツールとなる。しかし、オブジェクトがそのライフサイクルの中で状態を変化させていくことが自然な場合や、特定の振る舞いや複雑なロジックを主体としたい場合には、従来のクラスの方が適していることが多い。Recordの適切な利用シーンを理解し、クラスとRecordを使い分けることが、効果的なシステム設計において重要となる。

Recordの導入は、C#でのデータモデリングに新たな選択肢をもたらした。不変性、値ベースの等価性、そしてコードの簡潔さといった特長は、特にデータ構造の表現において、より堅牢で保守しやすいコードを書くための強力な手段となる。システムエンジニアを目指す上で、このような新しい言語機能とその適切な利用方法を学ぶことは、現代のソフトウェア開発において非常に価値のあるスキルとなるだろう。

関連コンテンツ

関連IT用語

関連ITニュース