Catatan C # 9.0 - jenis referensi dan konstruktor yang tidak dapat dinihilkan

Aug 15 2020

Saya hanya mencoba catatan sederhana:

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

Saya mendapat peringatan:

Properti non-nullable 'Name' tidak diinisialisasi. Pertimbangkan untuk mendeklarasikan properti sebagai nullable.

(sama untuk semua bidang kecuali CategoryId)

Pada dasarnya, jika saya mengerti dengan benar, konstruktor yang menerima dan mengatur semua bidang tidak dibuat secara otomatis oleh kompiler dan (saat menggunakan #nullable enable) saya harus menulisnya sendiri, yaitu:

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

Pertanyaan saya adalah, apakah ini benar? Saya sangat terkejut dengan ini karena saya pikir intinya adalah membuat rekaman seperti itu sangat sederhana, dan harus menulis / memelihara konstruktor sangat membosankan, terutama pada rekaman besar yang sering berubah. Atau apakah saya melewatkan sesuatu di sini?

Jawaban

3 IvanStoev Aug 15 2020 at 18:06

Anda tampaknya mengharapkan Pembuat Utama yang dibuat secara otomatis , tetapi ini dibuat secara otomatis (dan secara umum Anda mendapatkan semua manfaat rekaman) saat Anda menggunakan parameter rekaman dalam deklarasi jenis rekaman , yang secara otomatis dipetakan ke publik getdan initproperti dan secara otomatis diinisialisasi dari konstruktor utama, sehingga menghilangkan peringatan NRT.

Yang berarti bahwa Anda mendapatkan semua jenis catatan gula dengan pada dasarnya menggunakan sintaks konstruktor normal dengan recordkata kunci tambahan :

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