Записи C # 9.0 - ссылочные типы и конструктор, не допускающие значения NULL

Aug 15 2020

Я пробовал простую запись:

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

Я получаю предупреждения:

Свойство Name, не допускающее значения NULL, не инициализировано. Рассмотрите возможность объявления свойства как допускающего значение NULL.

(то же самое для всех полей, кроме CategoryId)

В принципе, если я правильно понимаю, конструктор, принимающий и устанавливающий все поля, не создается автоматически компилятором, и (при использовании #nullable enable) я должен написать его сам, то есть:

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

У меня вопрос, это правильно? Я очень удивлен этим, так как думал, что все дело в том, чтобы сделать создание таких записей действительно простым, а необходимость писать / поддерживать конструктор очень утомительна, особенно для больших записей, которые часто меняются. Или мне что-то здесь не хватает?

Ответы

3 IvanStoev Aug 15 2020 at 18:06

Кажется, вы ожидаете автоматически сгенерированного первичного конструктора , но он автоматически создается (и в целом вы получаете все преимущества записи), когда вы используете параметры записи в объявлении типа записи , которые автоматически сопоставляются с общедоступными getи initсвойствами и автоматически инициализируется из первичного конструктора, что устраняет предупреждение NRT.

Это означает, что вы получаете весь сахар типа записи, в основном используя синтаксис обычного конструктора с добавленным recordключевым словом:

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