C# 9.0-Datensätze – Nicht-Nullable-Referenztypen und Konstruktor

Aug 15 2020

Ich habe nur eine einfache Aufzeichnung versucht:

#nullable enable

public record Product
{
    public readonly string Name;
    public readonly int CategoryId;
    public readonly string Phone;
    public readonly Address Address;
    public readonly Manager Manager;
}

Ich bekomme Warnungen:

Die Eigenschaft „Name“, die keine NULL-Werte zulässt, ist nicht initialisiert. Erwägen Sie, die Eigenschaft als nullable zu deklarieren.

(gleich für alle Felder außer CategoryId)

Wenn ich das richtig verstehe, wird ein Konstruktor, der alle Felder akzeptiert und setzt, im Grunde nicht automatisch vom Compiler generiert, und (bei Verwendung von #nullable enable) muss ich ihn selbst schreiben, dh:

public Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) {
  this.Name=Name;
  this.CategoryId=CategoryId;
   ...
}

Meine Frage ist, ist das richtig? Ich bin davon sehr überrascht, da ich dachte, der springende Punkt sei, das Erstellen solcher Datensätze wirklich einfach zu machen, und den Konstruktor schreiben/pflegen zu müssen, ist sehr mühsam, insbesondere bei großen Datensätzen, die sich häufig ändern. Oder übersehe ich hier etwas?

Antworten

3 IvanStoev Aug 15 2020 at 18:06

Sie scheinen den automatisch generierten Primärkonstruktor zu erwarten , aber er wird automatisch generiert (und im Allgemeinen erhalten Sie alle Datensatzvorteile), wenn Sie die Datensatzparameter in der Datensatztypdeklaration verwenden , die automatisch auf public getund initproperties und abgebildet werden automatisch vom primären Konstruktor initialisiert, wodurch die NRT-Warnung eliminiert wird.

Das bedeutet, dass Sie alle Datensatztypen Zucker erhalten, indem Sie im Grunde die normale Konstruktorsyntax mit hinzugefügtem recordSchlüsselwort verwenden:

public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }