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 in struct und class Typen deklariert sind, einschließlich record- und record struct-Typen. Der required-Modifizierer kann nicht auf Member eines interface 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 zu null 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 kein required-Feld enthalten, das protected ist. Darüber hinaus müssen erforderliche Eigenschaften Setter (set oder init 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, den required-Modifizierer enthalten. Der abgeleitete Typ kann den required-Zustand nicht entfernen. Abgeleitete Typen können den required-Modifizierer hinzufügen, wenn eine Eigenschaft überschrieben wird.
  • Ein Typ mit allen required-Membern kann nicht als Typargument verwendet werden, wenn der Typparameter die new()-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 den required-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, entweder this() oder base(), muss auch das SetsRequiredMembers-Attribut enthalten. Dadurch wird sichergestellt, dass Aufrufer alle geeigneten Konstruktoren ordnungsgemäß verwenden können.
  • Kopierkonstruktoren, die für record-Typen generiert werden, haben das SetsRequiredMembers-Attribut angewendet, wenn eines der Member required 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.