Saya memiliki catatan C# seperti berikut, dengan properti yang mahal untuk dihitung:
sealed record MyAwesomeRecord(Dictionary<int, int> SomeDictionary)
{
public int ExpensiveToComputeProperty => SomeDictionary.Sum(e => e.Value);
//...
}
var original = new MyAwesomeRecord( new() { [0] = 0 });
var modified = original with { SomeDictionary = new() { [1] = 1 } };
Daripada menghitung ulang nilai ExpensiveToComputeProperty
pada setiap akses, saya ingin menghitungnya hanya sekali, setelah konstruksi. Namun ternyata dengan catatan C#, konstruktor tidak dipanggil lagi setelah modifikasi dengan with
. Saya mencoba cara berikut untuk memperbaikinya:
- Gunakan
class
biasa sebagai gantinya, tapi dengan begitu saya tidak bisa lagi menggunakan sintakswith
, yang ingin terus saya gunakan. - Simpan
ExpensiveToComputeProperty
di properti atau bidang biasa. Ini tidak berhasil, karena diinisialisasi satu kali, tetapi tidak setelah mengubahSomeDictionary
denganwith
. - AFAIK, ada rencana untuk memperkenalkan sintaks yang bagus yang memungkinkan saya terus memperbarui properti ini di C# 10. Sayangnya, C# 10 belum ada.
Apakah ada cara untuk menggunakan catatan yang menghindari pengulangan perhitungan yang mahal?