Enregistrements C # 9.0 - types de référence et constructeur non nullables

Aug 15 2020

J'ai essayé juste un simple enregistrement:

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

Je reçois des avertissements :

La propriété non nullable 'Name' n'est pas initialisée. Envisagez de déclarer la propriété comme nullable.

(identique pour tous les champs sauf CategoryId)

Fondamentalement, si je comprends bien, un constructeur acceptant et définissant tous les champs n'est pas généré automatiquement par le compilateur et (lorsque #nullable enablej'utilise ) je dois l'écrire moi-même, c'est-à-dire:

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

Ma question est, est-ce correct? Je suis très surpris par cela car je pensais que le but était de rendre la création d'enregistrements comme celle-ci vraiment simple, et devoir écrire/maintenir le constructeur est très fastidieux, en particulier sur les gros enregistrements qui changent souvent. Ou est-ce que je manque quelque chose ici?

Réponses

3 IvanStoev Aug 15 2020 at 18:06

Vous semblez attendre le constructeur principal généré automatiquement , mais il est généré automatiquement (et en général, vous bénéficiez de tous les avantages de l'enregistrement) lorsque vous utilisez les paramètres d'enregistrement dans la déclaration de type d'enregistrement , qui sont automatiquement mappés sur public getet initproperties et automatiquement initialisé à partir du constructeur principal, éliminant ainsi l'avertissement NRT.

Ce qui signifie que vous obtenez tout le sucre de type record en utilisant essentiellement la syntaxe normale du constructeur avec un recordmot-clé ajouté :

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