У меня есть запись 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
. - Насколько я знаю, есть планы ввести хороший синтаксис, который позволил бы мне обновлять это свойство в C# 10. К сожалению, C# 10 еще не существует.
Есть ли способ использовать записи, чтобы избежать повторного выполнения дорогостоящих вычислений?