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
那么这个问题的解决方案是什么?
答案 0 :(得分:4)
我没有在这里看到问题。 Total
getter 可以在调用时动态计算列表的总和,但根本不会修改列表。但是,我不知道你想如何为总...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
答案 1 :(得分:4)
您正在公开数据,它可以随时被删除,我建议如下:
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; }
}
答案 2 :(得分:2)
改变你获得动态返回总数的功能(使用linq最简单):
private float Total
{
get
{
return Data.Sum();
}
}
真的不需要设置访问器。
答案 3 :(得分:1)
将计算逻辑添加到Total getter:
private float Total
{
get { return CalculateResult(Data) };
}
这样你甚至不需要setter。当然你可以缓存:在更改数据列表时更改的类中引入脏标志。然后将您在Total getter中获得的计算结果缓存到本地类字段,并在未设置脏标志时重复使用(在重新计算时清除它)。
答案 4 :(得分:1)
我认为总属性中不需要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
}
答案 5 :(得分:0)
为什么你需要Total
上的setter?最好的方法是生成Total auto-calculated属性并动态计算Total的getter值。
或者......您可以引入私人字段data
和total
,并在total
setter中重新计算Data
。