C # вопрос о геттере и сеттере? - PullRequest
0 голосов
/ 23 октября 2009
   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

Итак, каково решение этой проблемы?

Ответы [ 6 ]

4 голосов
/ 23 октября 2009

Вы выставляете Данные, они могут быть стерты в любое время, я бы предложил следующее:

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; }
}
4 голосов
/ 23 октября 2009

Я не вижу здесь проблемы. Total getter может динамически вычислять сумму списка, когда он вызывается, что вообще не изменяет список. Однако я не понимаю, как вы хотите реализовать setter для всего ...

  private float Total { // Contains sum of numbers in Data
    get {
      float total = 0;
      foreach (float value in Data) {
        total += value;
      }
      return total;
    }
  }
2 голосов
/ 23 октября 2009

Вместо этого вы получаете функцию для динамического возврата суммы (использование linq проще всего):

private float Total
{
   get
   {
      return Data.Sum();
   }
}

На самом деле нет необходимости в наборе доступа.

1 голос
/ 23 октября 2009

Я думаю, что нет необходимости в установщике в общем свойстве, однако получатель просто пересчитывает сумму для каждого вызова

class Foo
   {
       public List<float> Data { get ; set ; }  // list of numbers
       private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data


   }
1 голос
/ 23 октября 2009

Добавить логику расчета к получателю итогов:

private float Total
{
  get { return CalculateResult(Data) };
}

Таким образом, вам даже не нужен сеттер. Конечно, вы можете кешировать: ввести грязный флаг в класс, который изменяется при изменении списка данных. Затем кешируйте результат вычисления, который вы получите в Total getter, в локальное поле класса и повторно используйте его, если не установлен флаг dirty (сбросьте его при пересчете).

0 голосов
/ 23 октября 2009

Зачем вам нужен сеттер на Total? Лучший способ - создать свойство для автоматически рассчитываемого Total и динамически вычислять значение получателя Total.

Или ... вы можете ввести приватные поля data и total и пересчитать total в Data setter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...