Rekordy C # 9,0 - typy odwołań i konstruktor nie dopuszczające wartości null

Aug 15 2020

Próbowałem tylko prostego rekordu:

#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;
}

Dostaję ostrzeżenia:

Właściwość „Name”, która nie dopuszcza wartości null, nie jest zainicjowana. Rozważ zadeklarowanie właściwości jako dopuszczającej wartość null.

(takie same dla wszystkich pól z wyjątkiem CategoryId)

Zasadniczo, o ile dobrze rozumiem, konstruktor akceptujący i ustawiający wszystkie pola nie jest automatycznie generowany przez kompilator i (przy używaniu #nullable enable) muszę sam to napisać tj .:

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

Moje pytanie brzmi: czy to prawda? Jestem tym bardzo zaskoczony, ponieważ myślałem, że chodzi o to, aby tworzenie takich rekordów było naprawdę proste, a konieczność pisania / utrzymywania konstruktora jest bardzo żmudna, szczególnie w przypadku dużych płyt, które często się zmieniają. A może coś mi tu brakuje?

Odpowiedzi

3 IvanStoev Aug 15 2020 at 18:06

Wydaje się, że oczekujesz automatycznie generowanego konstruktora podstawowego , ale jest on generowany automatycznie (i generalnie uzyskujesz wszystkie korzyści związane z rekordem), gdy używasz parametrów rekordu w deklaracji typu rekordu , które są automatycznie mapowane na publiczne geti initwłaściwości oraz automatycznie inicjowany z głównego konstruktora, eliminując w ten sposób ostrzeżenie NRT.

Co oznacza, że ​​otrzymujesz cały cukier typu rekordu, zasadniczo używając normalnej składni konstruktora z dodanym recordsłowem kluczowym:

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