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