Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der required Modifizierer gibt an, dass das feld oder die Eigenschaft , für das es gilt, 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.
Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.
In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.
Tipp
Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.
Mithilfe des required Modifizierers können Entwickler Typen erstellen, bei denen Eigenschaften oder Felder ordnungsgemäß initialisiert werden müssen, aber dennoch die Initialisierung über Objektinitialisierer zulassen. Mehrere Regeln stellen dieses Verhalten sicher:
- Wenden Sie den
requiredModifizierer auf Felder und Eigenschaften an, die instructundclassTypen deklariert sind, einschließlichrecordundrecord structTypen. Sie können denrequiredModifizierer nicht auf Member einesinterfaceElements anwenden. - Explizite Schnittstellenimplementierungen können nicht als
requiredgekennzeichnet werden. Sie können sie in Objektinitialisierern nicht festlegen. - Sie müssen die erforderlichen Member initialisieren, aber Sie können sie initialisieren in
null. Wenn der Typ ein nicht nullabler Verweistyp ist, gibt der Compiler eine Warnung aus, wenn Sie das Element innullinitialisieren. 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
publicKlasse kann z. B. keinrequiredFeld enthalten, dasprotectedist. Darüber hinaus müssen erforderliche Eigenschaften Setter (setoderinitZugriffsmethoden) aufweisen, die mindestens so sichtbar sind wie ihre enthaltenden Typen. Code, der eine Instanz erstellt, kann keine Elemente festlegen, auf die nicht zugegriffen werden kann. - Abgeleitete Klassen können ein in der Basisklasse deklariertes
requiredMember 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, denrequiredModifizierer enthalten. Der abgeleitete Typ kann denrequiredZustand nicht entfernen. Abgeleitete Typen können den Modifiziererrequiredhinzufügen, wenn sie eine Eigenschaft überschreiben. - Sie können keinen Typ mit beliebigen
requiredElementen als Typargument verwenden, wenn der Typparameter dienew()Einschränkung enthält. Der Compiler kann nicht erzwingen, dass alle erforderlichen Member im generischen Code initialisiert werden. - Sie können den
requiredModifizierer für die Deklaration nicht für Positionsparameter für einen Datensatz verwenden. Sie können eine explizite Deklaration für eine Positionseigenschaft hinzufügen, die denrequiredModifizierer 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. Dieses Attribut 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 AttributSetsRequiredMembersenthalten. 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 Memberrequiredist.
Warnung
Das SetsRequiredMembers Attribut 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.