2011-08-23 44 views
0

這是我在Effective C#書中看到的例子:swaping集防禦性副本

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類型。 「數據字段」的消費者不會記得他們將副本保留在堆上的舊存儲中。 如果「數據」是值類型 - 消費者(使用數據的其他代碼)會記住他們持有數據的深層副本,並在需要更新時再次請求它。

對不對?

+2

這裏很難遵循你的思路。請詳細說明。 –

回答

0

集合是一個引用類型,所以其他保存代碼將看到舊數據。

兩種可能的解決方案:

代替數據=臨時使用data.Clear(); data.AddRange(temp)將改變數據字段的內容。

或者更好地刪除MyCollection屬性並使類實現IEnumerable。這導致更好的封裝。

+0

第二期opt如何提供幫助? –

+0

您的類將通過實現控制枚舉的邏輯來控制對PayrollData的訪問。因此,您可以準確控制數據更改的時間以及枚舉中正在進行的迭代會發生什麼情況。 –

+0

此外,您可以避免其他人執行諸如instance.MyCollection.Clear()等清除所有項目的數據字段的情況。 –