Notwendiger Modifizierer (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 modifizierer required
können Entwickler Typen erstellen, bei denen Eigenschaften oder Felder ordnungsgemäß initialisiert werden müssen, die Initialisierung jedoch weiterhin mithilfe von Objektinitialisierern zulassen. Mehrere Regeln stellen dieses Verhalten sicher:
- Der
required
-Modifizierer kann auf -Felder und -Eigenschaften, die instruct
deklariert sind, sowie aufclass
-Typen, einschließlichrecord
- undrecord struct
-Typen, angewendet werden. 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 nicht nullabler Verweistyp ist, gibt der Compiler eine Warnung aus, wenn Sie das Element innull
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. Eine
public
Klasse kann z. B. 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
Member 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 den Modifiziererrequired
hinzufügen, wenn sie eine Eigenschaft überschreiben. - 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 attribut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute schreiben. Der Compiler überprüft jedoch nicht, ob diese Konstruktoren alle erforderlichen Member initialisieren. Stattdessen gibt das Attribut dem Compiler an, dass der Konstruktor alle notwendigen Member initialisiert. Das SetsRequiredMembers
-Attribut fügt die folgenden Regeln zu Konstruktoren hinzu:
- Ein Konstruktor, der an einen anderen Konstruktor angehängt ist, der mit dem Attribut
SetsRequiredMembers
, entwederthis()
oderbase()
, annotiert ist, muss auch das AttributSetsRequiredMembers
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 die Überprüfungen des Compilers, ob alle required
Elemente initialisiert werden, wenn ein Objekt erstellt wird. Verwenden Sie es mit Vorsicht.
Der folgende Code zeigt eine Klassenhierarchie, die den required
Modifizierer für die eigenschaften FirstName
und LastName
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 Mitgliedern finden Sie in der C#11 – Erforderliche Mitglieder Funktionsspezifikation.