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 getter 可以在调用时动态计算列表的总和,但根本不会修改列表。但是,我不知道你想如何为总...

实现 setter
  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 getter:

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

这样你甚至不需要setter。当然你可以缓存:在更改数据列表时更改的类中引入脏标志。然后将您在Total getter中获得的计算结果缓存到本地类字段,并在未设置脏标志时重复使用(在重新计算时清除它)。

我认为总属性中不需要setter,但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 的setter?最好的方法是生成Total auto-calculated属性并动态计算Total的getter值。

或者......您可以在 Data setter中引入私有字段 data total 并重新计算 total

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top