Modifizierer „required“ (C#-Referenz)
Der required
-Modifizierer gibt an, dass das Feld oder die Eigenschaft , auf das es angewendet wird, von einem Objektinitialisierer initialisiert werden muss. Jeder Ausdruck, der eine neue Instanz des Typs initialisiert, muss alle erforderlichen Member initialisieren. Der required
-Modifizierer ist ab C# 11 verfügbar. Mit dem required
-Modifizierer können Entwickler Typen erstellen, bei denen Eigenschaften oder Felder ordnungsgemäß initialisiert werden müssen, aber dennoch die Initialisierung mithilfe von Objektinitialisierern zulassen. Mehrere Regeln stellen dieses Verhalten sicher:
- Der
required
-Modifizierer kann auf Felder und Eigenschaften angewendet werden, die instruct
undclass
Typen deklariert sind, einschließlichrecord
- undrecord struct
-Typen. Derrequired
-Modifizierer kann nicht auf Member einesinterface
angewendet werden. - Explizite Schnittstellenimplementierungen können nicht als
required
gekennzeichnet werden. Sie können in Objektinitialisierern nicht festgelegt werden. - Erforderliche Member müssen initialisiert werden, sie können jedoch zu
null
initialisiert werden. Wenn der Typ ein Non-Nullable Verweistyp ist, gibt der Compiler eine Warnung aus, wenn Sie das Element zunull
initialisieren. Der Compiler gibt einen Fehler aus, wenn das Element überhaupt nicht initialisiert wird. - Erforderliche Member müssen mindestens so sichtbar sein wie der enthaltende Typ. Beispielsweise kann eine
public
-Klasse keinrequired
-Feld enthalten, dasprotected
ist. Darüber hinaus müssen erforderliche Eigenschaften Setter (set
oderinit
Zugriffsmethoden) aufweisen, die mindestens so sichtbar sind wie ihre enthaltenden Typen. Elemente, auf die nicht zugegriffen werden kann, können nicht durch Code festgelegt werden, der eine Instanz erstellt. - Abgeleitete Klassen können ein in der Basisklasse deklariertes
required
-Element nicht ausblenden. Durch das Ausblenden eines erforderlichen Elements wird verhindert, dass Aufrufer Objektinitialisierer dafür verwenden. Darüber hinaus müssen abgeleitete Typen, die eine erforderliche Eigenschaft überschreiben, denrequired
-Modifizierer enthalten. Der abgeleitete Typ kann denrequired
-Zustand nicht entfernen. Abgeleitete Typen können denrequired
-Modifizierer hinzufügen, wenn eine Eigenschaft überschrieben wird. - Ein Typ mit allen
required
-Membern kann nicht als Typargument verwendet werden, wenn der Typparameter dienew()
-Einschränkung enthält. Der Compiler kann nicht erzwingen, dass alle erforderlichen Member im generischen Code initialisiert werden. - Der
required
-Modifizierer ist für die Deklaration für Positionsparameter für einen Datensatz nicht zulässig. Sie können eine explizite Deklaration für eine Positionseigenschaft hinzufügen, die denrequired
-Modifizierer enthält.
Einige Typen, z. B. Positionsdatensätze, verwenden einen primären Konstruktor, um Positionseigenschaften zu initialisieren. Wenn eine dieser Eigenschaften den required
-Modifizierer enthält, fügt der primäre Konstruktor das SetsRequiredMembers
-Attribut hinzu. Dies gibt an, dass der primäre Konstruktor alle erforderlichen Member initialisiert. Sie können ihren eigenen Konstruktor mit dem System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute-Attribut schreiben. Der Compiler überprüft jedoch nicht, ob diese Konstruktoren alle erforderlichen Member initialisieren. Stattdessen bestätigt das Attribut den Compiler, dass der Konstruktor alle erforderlichen Member initialisiert. Das SetsRequiredMembers
-Attribut fügt die folgenden Regeln zu Konstruktoren hinzu:
- Ein Konstruktor, der mit dem
SetsRequiredMembers
-Attribut mit Anmerkungen versehenem Konstruktor verkettet ist, entwederthis()
oderbase()
, muss auch dasSetsRequiredMembers
-Attribut enthalten. Dadurch wird sichergestellt, dass Aufrufer alle geeigneten Konstruktoren ordnungsgemäß verwenden können. - Kopierkonstruktoren, die für
record
-Typen generiert werden, haben dasSetsRequiredMembers
-Attribut angewendet, wenn eines der Memberrequired
ist.
Warnung
Die SetsRequiredMembers
deaktiviert Compilerüberprüfungen, ob alle required
-Member initialisiert werden, wenn ein Objekt erstellt wird. Verwenden Sie sie mit Vorsicht.
Der folgende Code zeigt eine Klassenhierarchie, die den required
-Modifizierer für die FirstName
- und LastName
-Eigenschaften verwendet:
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; }
}
Weitere Informationen zu erforderlichen Members finden Sie in der Featurespezifikation C#11 – Erforderliche Member.