Record C# 9.0: tipi di riferimento e costruttore non annullabili

Aug 15 2020

Ho provato solo un semplice record:

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

Ricevo avvisi:

La proprietà non nullable 'Name' non è inizializzata. Si consideri la possibilità di dichiarare la proprietà come Nullable.

(uguale per tutti i campi tranne CategoryId)

Fondamentalmente, se ho capito bene, un costruttore che accetta e imposta tutti i campi non viene generato automaticamente dal compilatore e (quando si utilizza #nullable enable) devo scriverlo da solo, ovvero:

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

La mia domanda è, è corretto? Sono molto sorpreso da questo perché pensavo che il punto fosse rendere la creazione di dischi del genere davvero semplice, e dover scrivere/mantenere il costruttore è molto noioso, specialmente su dischi grandi che cambiano spesso. O mi sto perdendo qualcosa qui?

Risposte

3 IvanStoev Aug 15 2020 at 18:06

Sembra che ti aspetti il ​​Primary Constructor generato automaticamente , ma viene generato automaticamente (e in generale ottieni tutti i vantaggi del record) quando utilizzi i parametri del record nella dichiarazione del tipo di record , che vengono automaticamente mappati a public gete initproperties e inizializzato automaticamente dal costruttore primario, eliminando così l'avviso NRT.

Ciò significa che ottieni tutto lo zucchero del tipo di record utilizzando fondamentalmente la normale sintassi del costruttore con la recordparola chiave aggiunta:

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