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

コレクションは参照型であるため、その上にある他の保持コードは古いデータを参照します。

2つの可能な解決策:

data =tempの代わりにdata.Clear();を使用します。data.AddRange(temp)は、データフィールドの内容を変更します。

または、MyCollectionプロパティを削除して、クラスにIEnumerableを実装させることをお勧めします。これにより、カプセル化が大幅に改善されます。

于 2011-08-23T21:46:59.877 に答える