-5

このコードの動作はどうなりますか? s == 「変更されたインスタンス」または s == 「最初のインスタンス」になりますか?

SomeClass instance = new SomeClass();
instance.setName("initial instance")

List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();

list1.add(instance);
list2.add(instance);

list2.get(0).setName("changed instance");
string s = list1.get(0).getName();

編集:わかりました、コードにいくつかの変更を加えました。かなり急いで書いていました。EDIT2:なぜ私はこれを求めていて、試さないのですか?いくつかの制限により、このコンピューターには IDE がないためです。

4

3 に答える 3

5

オブジェクトは参照によって渡されます。同じオブジェクトへの参照を持つ 2 つのリストがあります。したがって、1 つのリストでオブジェクトを変更すると、他のリストに影響します。オブジェクトではなくプリミティブを渡す場合は、値渡しになります。値渡しの場合は、基本的にコピーです。したがって、一方のリストの値を変更しても、もう一方のリストの値は変更されません。

クラスに「値のような」動作を持たせたい場合は、それ自体のコピーを返すクラスにメソッドを作成できます。つまり、元のオブジェクトと同じ値に設定されたメンバーやプロパティなどを含む新しいオブジェクトです。

例:

public SomeClass Clone()
{
    SomeClass newSomeClass = new SomeClass();
    newSomeClass.setName(this.getName());
    return newSomeClass;
}

次に、コードは次のようになります。

SomeClass instance = new SomeClass();
instance.setName("initial instance")

List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();

list1.add(instance);
list2.add(instance.Clone());

list2.get(0).setName("changed instance");
string s = list.get(0).getName();

その結果、list1 と list2 には、異なる名前を持つ 2 つの異なる SomeClass インスタンスが含まれます。

値と参照型の詳細については、 MSDNを参照してください。

于 2013-02-13T22:05:21.233 に答える
3

オブジェクトを 2 つのリストに追加し、一方のリストのオブジェクトを変更すると、もう一方のリストは引き続き同じオブジェクトを参照するため、値が更新されます。

于 2013-02-13T22:04:12.697 に答える
2

「変更されたインスタンス」は、インスタンスを 1 つだけ作成してその実装を共有するためです。

于 2013-02-13T22:03:23.493 に答える