Mendefinisikan properti dalam record dua kali
Di C # 9, seseorang dapat mendefinisikan properti dengan nama yang sama dalam rekaman baik di konstruktor utamanya maupun di tubuhnya:
record Cat(int PawCount)
{
public int PawCount { get; init; }
}
Kode ini dikompilasi tanpa kesalahan.
Saat menginisialisasi instance dari record semacam itu, nilai yang diberikan ke konstruktor akan diabaikan sepenuhnya:
Console.WriteLine(new Cat(4));
Console.WriteLine(new Cat(4) { PawCount = 1 });
cetakan
Cat { PawCount = 0 }
Cat { PawCount = 1 }
Apakah perilaku ini benar atau apakah itu bug? Jika benar, dalam kasus apa ini berguna?
Saya mengharapkan kompilator untuk menolak kode ini dengan kesalahan seperti 'Tipe Cat
sudah berisi definisi untuk PawCount
' atau menganggap properti di konstruktor dan di badannya sama, melakukan inisialisasi dari konstruktor. Varian terakhir dapat berguna untuk menyediakan properti dengan pengambil dan / atau penginisialisasi kustom tanpa harus menulis ulang semua properti dari catatan posisi dalam tubuhnya.
Perilaku sebenarnya tidak masuk akal bagi saya.
Jawaban
Cara yang benar untuk melakukannya adalah:
record Cat(int PawCount)
{
public int PawCount { get; init; } = PawCount;
}
Ini berguna karena memungkinkan Anda untuk melakukan misalnya validasi
record Cat(int PawCount)
{
private int _pawCount;
public int PawCount {
get => _pawCount;
init => _pawCount = value < 0 ? throw new ArgumentException() : value;
} = PawCount;
}
Spesifikasi untuk ini ada di sini: https://github.com/dotnet/csharplang/blob/master/proposals/csharp-9.0/records.md#members-of-a-record-type
Anggota disintesis kecuali jika anggota dengan tanda tangan "cocok" dinyatakan dalam badan rekaman atau anggota non-virtual konkret yang dapat diakses dengan tanda tangan "cocok" diwariskan. Dua anggota dianggap cocok jika mereka memiliki tanda tangan yang sama atau akan dianggap "bersembunyi" dalam skenario warisan.
Jadi karena properti dengan nama yang sama dengan parameter sudah ada, compiler tidak akan mensintesis PawCount
properti, dan mengabaikan parameter itu secara diam-diam kecuali Anda menggunakannya sendiri secara eksplisit.