Freigeben über


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 in structdeklariert sind, sowie auf class-Typen, einschließlich record- und record struct-Typen, angewendet werden. Der required-Modifizierer kann nicht auf Member eines interface angewendet werden.
  • Explizite Schnittstellenimplementierungen können nicht als requiredgekennzeichnet 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 in nullinitialisieren. 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. kein required Feld enthalten, das protectedist. 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 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, den required Modifizierer enthalten. Der abgeleitete Typ kann den required Zustand nicht entfernen. Abgeleitete Typen können den Modifizierer required hinzufügen, wenn sie eine Eigenschaft überschreiben.
  • 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 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, entweder this()oder base(), annotiert ist, muss auch das Attribut SetsRequiredMembers 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 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.