0

这是我在Effective C#书中看到的一个示例:

private BindingList<PayrollData> data; 
public IBindingList MyCollection 
{
get { return data; } 
}
public void UpdateData() 
{
// Unreliable operation might fail: 
var temp = UnreliableOperation();
// This operation will only happen if 
// UnreliableOperation does not throw an 
// exception. 
data = temp;
}

作者说这将适用于值类型而不是引用类型。我无法理解他的意思。

我想我现在明白了:集合是 ref 类型。“数据字段”的消费者不会记得他们持有堆上旧存储的副本。如果“数据”是值类型 - 消费者(使用数据的其他代码)会记得他们持有数据的深层副本,并会在需要更新时再次请求它。

正确的 ?

4

1 回答 1

0

该集合是一个引用类型,因此其他持有代码将看到旧数据。

两种可能的解决方案:

而不是 data = temp 使用 data.Clear(); data.AddRange(temp) 将更改数据字段的内容。

或者最好删除 MyCollection 属性并使类实现 IEnumerable。这导致更好的封装。

于 2011-08-23T21:46:59.877 回答