必須修飾子 (C# リファレンス)
required
修飾子は、フィールド または プロパティ に適用される場合、オブジェクト初期化子で初期化しなければならないことを示します。 型の新しいインスタンスを初期化する式では、すべての "required メンバー" を初期化する必要があります。 required
修飾子は、C# 11 以降で使用できます。 required
修飾子を使用すると、開発者はプロパティまたはフィールドを適切に初期化する必要がある型を作成できますが、オブジェクト初期化子を使用した初期化は引き続き許可されます。 いくつかのルールにより、この動作が保証されます。
required
修飾子は、フィールド 及び プロパティ がstruct
で宣言されたもの、さらにrecord
やrecord 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 - 必須メンバー 機能仕様」を参照してください。
.NET