Решение специфической задачи инициализации - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем. Помогите написать элегантный код. Поясню на примере. Что есть сейчас:
private Type1 A_value;
private Type2 B_value;
 
private bool A_calculated;
private bool B_calculated;
 
public void Refresh()
{
  A_calculated = false;
  B_calculated = false;
}
 
public Type1 A
{
  get{
    if(A_calculated)
       return A_value;
    else
       A_value = Calculate_A();
       A_calculated = true;
       return A_value;
  }
}
 
public Type2 B
{
  get{
    if(B_calculated)
       return B_value;
    else
       B_value = Calculate_B();
       B_calculated = true;
       return B_value;
  }
}
Особенности. Функции Calculate_A() и Calculate_B() выполняются долго. Поэтому их вызов происходит только при обращении. Более того, между вызовами функции Refresh() эти величины остаются теми же, поэтому нет смысла их пересчитывать.

Что получилось

: при данном подходе достаточно неудобно добавлять новые методы: если я решу добавить свойство Type3 C, то мне необходимо будет также добавить (кроме самого свойства): 1) переменную C_ccalculated 2) В функцию Refresh() строку С_calculated = false;

Что я хочу:

как то унифицировать эти свойства, чтобы добавить новое свойство было бы проще, не пришлось бы вспоминать куда нужно дописать строчку сброса флага.

Как это сделать?

как вариант можно было бы написать контейнер, но я не могу придумать как, т.к. тип у меня разный. Посоветуйте пожалуйста кто разбирается.

Решение задачи: «Решение специфической задачи инициализации»

textual
Листинг программы
public void refresh()
{
  lazyA = new Lazy<Type1>();
  lazyB = new Lazy<Type2>();
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы