次の方法で共有


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

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

  • required 修飾子は、フィールド 及び プロパティstructで宣言されたもの、さらに recordrecord struct 型を含む class 型に適用できます。 required 修飾子は、interfaceのメンバーには適用できません。
  • 明示的なインターフェイスの実装を requiredとしてマークすることはできません。 オブジェクト初期化子で設定することはできません。
  • 必要なメンバーは初期化する必要がありますが、nullに初期化できます。 型が null 非許容参照型の場合、メンバーを nullに初期化すると、コンパイラによって警告が発行されます。 メンバーが初期化されていない場合、コンパイラはエラーを発行します。
  • 型に含まれる必須のメンバーは、少なくともその型と同じくらいの可視性を持つ必要があります。 たとえば、public クラスには、required フィールドが protectedである場合に含めることはできません。 さらに、必要なプロパティには、少なくともその包含型と同じくらい見えるセッター (set または init アクセサー) が必要です。 アクセスできないメンバーは、インスタンスを作成するコードでは設定できません。
  • 派生クラスでは、基底クラスで宣言されている required メンバーを非表示にすることはできません。 必要なメンバーを非表示にすると、呼び出し元はオブジェクト初期化子を使用できなくなります。 さらに、必要なプロパティをオーバーライドする派生型には、required 修飾子を含める必要があります。 派生型は、required 状態を削除できません。 派生型は、プロパティをオーバーライドするときに required 修飾子を追加できます。
  • 型パラメーターに new() 制約が含まれている場合、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 - 必須メンバー 機能仕様」を参照してください。