ฉันมีบันทึก C# ดังต่อไปนี้ พร้อมคุณสมบัติที่มีราคาแพงในการคำนวณ:
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 } };
แทนที่จะคำนวณค่า ExpensiveToComputeProperty
อีกครั้งในทุกการเข้าถึง ฉันต้องการคำนวณเพียงครั้งเดียวหลังจากการก่อสร้าง แต่เห็นได้ชัดว่าด้วยบันทึก C# ตัวสร้างจะไม่ถูกเรียกใช้อีกครั้งหลังจากแก้ไขด้วย with
ฉันลองวิธีต่อไปนี้เพื่อแก้ไขปัญหานี้:
- ใช้
class
ปกติแทน แต่ด้วยวิธีนี้ ฉันจะไม่สามารถใช้ไวยากรณ์with
ซึ่งฉันต้องการใช้ต่อไปได้อีกต่อไป - เก็บ
ExpensiveToComputeProperty
ไว้ในคุณสมบัติหรือฟิลด์ปกติ สิ่งนี้ใช้ไม่ได้เนื่องจากมีการกำหนดค่าเริ่มต้นเพียงครั้งเดียว แต่ไม่ใช่หลังจากเปลี่ยนSomeDictionary
ด้วยwith
- AFAIK มีแผนที่จะแนะนำไวยากรณ์ที่ดีที่จะให้ฉันอัปเดตคุณสมบัตินี้ใน C# 10 น่าเสียดายที่ C# 10 ยังไม่อยู่ที่นี่
มีวิธีใช้บันทึกที่หลีกเลี่ยงการทำการคำนวณราคาแพงซ้ำหรือไม่?