ホームに戻る
出典 :
関連 :
目次 :
プライマリコンストラクタ
プライマリコンストラクタはクラスの宣言とコンストラクタ定義を一括で行う記法で、クラス、構造体、レコードの宣言を簡略化できる。
C#12で導入された。
例
プライマリコンストラクタを用いた構造体の宣言
// 構造体 Distance 宣言
// プライマリコンストラクタ使用
public struct Distance(double dx, double dy)
{
// 読み取り専用プロパティ
public readonly double Magnitude => Math.Sqrt(dx * dx + dy * dy);
public readonly double Direction => Math.Atan2(dy, dx);
// Translate() メソッド
public void Translate(double deltaX, double deltaY)
{
dx += deltaX;
dy += deltaY;
}
// デフォルトコンストラクタ
public Distance() : this(0,0) { }
}
従来記法による構造体の宣言
// 構造体 Distance 宣言
public struct Distance
{
// フィールド
private double __unspeakable_dx;
private double __unspeakable_dy;
// 読み取り専用プロパティ
public readonly double Magnitude => Math.Sqrt(__unspeakable_dx * __unspeakable_dx + __unspeakable_dy * __unspeakable_dy);
public readonly double Direction => Math.Atan2(__unspeakable_dy, __unspeakable_dx);
// Translate() メソッド
public void Translate(double deltaX, double deltaY)
{
__unspeakable_dx += deltaX;
__unspeakable_dy += deltaY;
}
// 引数付きコンストラクタ
public Distance(double dx, double dy)
{
__unspeakable_dx = dx;
__unspeakable_dy = dy;
}
// デフォルトコンストラクタ
public Distance() : this(0, 0) { }
}
解説
上記の2つのコードは等価である。
プライマリコンストラクタを用いた場合、引数 dx 、dy をプロパティおよび Translate() メソッドから参照しているが、
これは本来 __unspeakable_dx 、__unspeakable_dy の各フィールドを参照するものである。
プライマリコンストラクタを用いることで、__unspeakable_dx 、__unspeakable_dy がバッキングフィールド化されるとともに
- フィールド __unspeakable_dx 、__unspeakable_dy の宣言および代入
- 引数つきコンストラクタの記述
が削減され、簡潔なコードとなる。
なお、=> は式形式の get アクセサを意味する。
C#9で追加されたレコード型は、クラス、構造体に先行してプライマリコンストラクタに対応している。
レコードにプライマリコンストラクタを宣言した場合、コンストラクタ引数と同名のパブリックプロパティが生成される。
これにより、イミュータブル(不変)なレコードを簡潔に定義することができる。詳細はリンク先を参照。