Вместо обновления цены динамически вычисляйте цену в свойстве Price
. Таким образом, вы уверены, что он всегда отражает текущее состояние.
public virtual double Price
{
get
{
if (width == 8 && height == 10) return 3.99;
if (width == 10 && height == 12) return 5.99;
return 9.99;
}
}
Я только что сделал этот тест скорости со свойством, как указано выше:
var stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 1_000_000; i++) {
photo.Height = 4;
double price = photo.Price;
photo.Height = 10;
price = photo.Price;
}
stopWatch.Stop();
Console.WriteLine("Elapsed ms: " + stopWatch.ElapsedMilliseconds);
Обратите внимание, что он вычисляетцена в 2 миллиона раз. Выполнение занимает 67 мс! Поэтому не стоит пытаться оптимизировать этот расчет. Вы экономите всего несколько наносекунд. Но помещение вычисления в свойство упрощает ваш код и делает его более надежным.
Обратите также внимание, что вы должны переопределить существующий метод ToString
, унаследованный от object
.
public override string ToString()
{
return $"{GetType()}: width = {width}, height = {height}, base price = {Price:C2}";
}
Затем вы можете распечатать фотографию с помощью
WriteLine(photo);
, так как WriteLine
автоматически использует этот метод сейчас. Я также использовал строковую интерполяцию. Это более читабельно, чем конкатенация строк.