required 修飾子 (C# リファレンス)

required 修飾子は、適用対象の "フィールド" または "プロパティ" を、オブジェクト初期化子を使って初期化する必要があることを示します。 型の新しいインスタンスを初期化する式では、すべての "required メンバー" を初期化する必要があります。 required 修飾子は C# 11 以降で使用できます。 開発者は、required 修飾子を使うことで、プロパティまたはフィールドを適切に初期化する必要がある型を作成できますが、その場合でも、オブジェクト初期化子を使って初期化できます。 いくつかの規則により、この動作が保証されます。

  • required 修飾子は、struct で宣言されている "フィールド" と "プロパティ"、および class 型 (record および record struct 型を含む) に適用できます。 required 修飾子は、interface のメンバーには適用できません。
  • 明示的なインターフェイスの実装を required としてマークすることはできません。 それらをオブジェクト初期化子で設定することはできません。
  • required メンバーは初期化される必要がありますが、null に初期化できます。 型が null 非許容の参照型である場合、メンバーを null に初期化すると、コンパイラで警告が発生します。 メンバーがまったく初期化されていない場合は、コンパイラ エラーになります。
  • required メンバーの可視性は、それを含んでいる型と少なくとも同じである必要があります。 たとえば、public クラスに、protected である required フィールドを含めることはできません。 さらに、required プロパティには、可視性がそれを含む型以上であるセッター (set または init アクセサー) が必要です。 アクセスできないメンバーは、インスタンスを作成するコードでは設定できません。
  • 基底クラスで宣言されている required メンバーを、派生クラスで隠ぺいすることはできません。 required メンバーを隠ぺいすると、呼び出し元はそれに対してオブジェクト初期化子を使用できなくなります。 さらに、required プロパティをオーバーライドする派生型は、required 修飾子を含む必要があります。 派生型で required 状態を削除することはできません。 派生型でプロパティをオーバーライドするときに、required 修飾子を追加できます。
  • 型パラメーターに new() 制約が含まれる場合、任意の required メンバーを持つ型を型引数として使うことはできません。 コンパイラで、すべての required メンバーが汎用コードで初期化されるように強制することはできません。
  • レコードの位置指定パラメーターの宣言では、required 修飾子を使用できません。 required 修飾子を含む位置プロパティの明示的な宣言を追加できます。

位置レコードなどの一部の型は、プライマリ コンストラクターを使用して位置プロパティを初期化します。 これらのプロパティのいずれかに required 修飾子が含まれる場合、プライマリ コンストラクターによって SetsRequiredMembers 属性が追加されます。 これは、プライマリ コンストラクターによって必要なメンバーがすべて初期化されることを示します。 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 属性を使用して独自のコンストラクターを記述できます。 しかし、これらのコンストラクターが必要なメンバーをすべて初期化することを、コンパイラから確認されることはありません。 代わりに、この属性は、コンストラクターが必要なすべてのメンバーを初期化することをコンパイラにアサートします。 この SetsRequiredMembers 属性を使用すると、コンストラクターに次の規則が追加されます。

  • SetsRequiredMembers 属性で注釈付けされた別のコンストラクターにチェーンするコンストラクターも (this() または base() 属性)、SetsRequiredMembers を含む必要があります。 これにより、呼び出し元で適切なすべてのコンストラクターを正しく使用できるようになります。
  • record 型に対して生成されるコピー コンストラクターでは、メンバーのいずれかが required である場合、SetsRequiredMembers 属性が適用されます。

警告

SetsRequiredMembers を使用すると、オブジェクト作成時のコンパイラによるすべての required メンバーが初期化されることのチェックが無効になります。 慎重に使用してください。

次のコードでは、FirstName プロパティと LastName プロパティに required 修飾子を使用するクラス階層を示します。

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName) =>
        (FirstName, LastName) = (firstName, lastName);

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

必須メンバーの詳細については、「C#11 - 必須メンバー」の機能仕様をご覧ください。