C # вопрос о геттере и сеттере?
-
06-07-2019 - |
Вопрос
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get ; set ; } // Contains sum of numbers in Data
// Constructors and other stuff.
}
Мой код, использующий этот класс, постоянно меняется. Data
поэтому я хочу увидеть соответствующие изменения в Total
также.
Я не хочу добавлять функцию, которая пересчитывает Total
к коду, который изменяет Data
.
Пример:
Foo f = new Foo(); // Total = 0
f.Data.Add(10); // Total = 10
f.Data.Add(30); // Total = 40
f[1] = 40; // Total = 50
// etc
Так каково же решение этой проблемы?
Решение
Вместо этого вы получите функцию для динамического возврата суммы (проще всего использовать linq):
private float Total
{
get
{
return Data.Sum();
}
}
На самом деле нет необходимости в наборе аксессуаров.
Другие советы
Я не вижу здесь проблемы.А Total
добытчик может динамически вычислять общую сумму списка при его вызове, что вообще не изменяет список.Однако я не понимаю, как вы хотите реализовать сеттер на общую сумму...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
Вы раскрываете данные, все они могут быть удалены в любой момент, я бы предложил следующее:
class Foo
{
private List<float> _data = new List<float>();
public float Total {get; private set;}
public void Add(float f) { _data.Add(f); Total += f; }
}
Добавьте логику расчета в геттер Total:
private float Total
{
get { return CalculateResult(Data) };
}
Таким образом, вам даже не понадобится сеттер.Конечно, вы можете кэшировать:введите грязный флаг в класс, который изменяется при изменении списка данных.Затем кешируйте результат вычисления, который вы получаете в Total getter, в поле локального класса и повторно используйте его, если грязный флаг не установлен (очистите его при перерасчете).
Я думаю, что нет необходимости в установщике в общем свойстве, однако геттер просто пересчитывает сумму для каждого вызова.
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
Зачем нужен сеттер Total
?Лучший способ — сделать свойство Total автоматически вычисляемым и динамически вычислять значение метода получения Total.
Или...вы можете ввести частные поля data
и total
и пересчитать total
в пределах Data
сеттер.