Rekordy C # 9,0 - typy odwołań i konstruktor nie dopuszczające wartości null
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
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 record
słowem kluczowym:
public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }