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 - 必須メンバー」の機能仕様をご覧ください。
.NET