3

参照型のリストであるメンバー変数があります。メソッド I create and item で、それをリストに追加します。その後、アイテムは別のインスタンスを指すように更新されますが、リスト内のインスタンスは更新されません (これは単体テスト コードにあります)。例は次のようになります

Item localItem = new Item(arg1, arg2);
this.itemList.Add(localItem);

// Do some testing and assertions

localItem = new Item(arg3, arg4);  // This does not update the instance of
                                   // localItem in this.ItemList

// Do some more testing and assertions

テストを更新してこれを修正できますが、それでも驚きました。リストはAddメソッドを介して渡された元のインスタンスを保持したいと考えており、それを渡すために使用されたローカル変数が別のものを指しているかどうかは気にしません。誰かがこの理解を確認したり、より明確に説明したりできますか?

4

2 に答える 2

6

もちろん違います。はlocalItem実際のオブジェクトへの参照です (オブジェクト自体ではありません)。リストには、この同じオブジェクトへの参照も含まれています。別のアイテムを割り当てるとlocalItem、別のオブジェクトを指すようになりますが、リストにはまだ古いオブジェクトへの参照があります。

リスト内のオブジェクトを自動的に更新する場合は、アイテムへの参照を保持する新しいオブジェクトを導入し、これをリストに追加する必要があります

public class ItemReference
{
    public Item Item { get; set; }
}

これで、このようなローカル アイテムを作成できます

ItemReference itemRef = new ItemReference();
itemRef.Item = new Item(arg1, arg2);

this.itemReferenceList.Add(itemRef);
itemRef.Item = new Item(arg3, arg4);

リストには同じ (変更されていない) への参照があるためitemRef、新しいアイテムも「認識」されます。

リストは次のように宣言する必要があります

List<ItemReference> itemReferenceList;
于 2012-06-28T17:44:34.087 に答える
3

localItemリストに追加するときは、オブジェクトインスタンスへの参照Itemを追加します(参照型が別名であると仮定します)-後で新しいインスタンスclassを作成すると、結果は新しい参照(ポインタと同様)になります-更新する場合古いアイテムを削除して新しいアイテムを追加する必要があるリスト-これらは2つのまったく異なるインスタンスです。または、上のプロパティを変更することもできます。これらは、リストからアイテムにアクセスしたときに反映されます。ItemlocalItem

于 2012-06-28T17:43:55.103 に答える