次の方法で共有


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

required修飾子は、適用するフィールドまたはプロパティオブジェクト初期化子によって初期化する必要があることを示します。 型の新しいインスタンスを初期化する式では、すべての "required メンバー" を初期化する必要があります。 required修飾子は、C# 11 以降で使用できます。

C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。

このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。

ヒント

C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。

required修飾子を使用すると、開発者はプロパティまたはフィールドを適切に初期化する必要がある型を作成できますが、オブジェクト初期化子による初期化は引き続き許可されます。 いくつかのルールにより、この動作が保証されます。

  • record型やrecord struct型など、struct型とclass型で宣言されたフィールドプロパティrequired修飾子を適用します。 interfaceのメンバーにrequired修飾子を適用することはできません。
  • 明示的なインターフェイス実装を 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 型に対して生成されたコピー コンストラクターには、メンバーのいずれかが SetsRequiredMembersされている場合、required 属性が適用されます。

警告

SetsRequiredMembers属性は、オブジェクトの作成時にすべてのrequiredメンバーが初期化されるというコンパイラのチェックを無効にします。 注意して使用してください。

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

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 - 必須メンバー 機能仕様」を参照してください。