2

Vector クラスがあり、次の単体テストを (nUnit を使用して) テストしていました。

1  Vector test1 = new Vector(new double[] { 6, 3, 4, 5 });
2  Vector test2 = test1;
3  Assert.AreEqual(test1, test2, "Reference test");
4  test2 = new Vector(new double[] { 3, 3, 4, 5 });
5  Assert.AreEqual(test1, test2, "Reference test");

3 行目の最初のテストはパスしますが、5 行目の 2 番目のテストは失敗します。2 行目で代入ステートメントを実行したため、test2 も test1 と同じメモリを指すべきではないでしょうか? 私のVectorはクラスとして定義されているので、参照型です。一方、次のテストはパスします。

1  Vector test1 = new Vector(new double[] { 6, 3, 4, 5 });
2  Vector test2 = test1;
3  Assert.AreEqual(test1, test2, "Reference test");
4  test2[1] = 4;
5  Assert.AreEqual(test1, test2, "Reference test");

new 演算子を使用して新しいオブジェクトを定義すると、古い代入は無効になるということですか? 他の(または正しい - 私が間違っている場合)説明はありますか?

4

5 に答える 5

4

この線

test2 = new Vector(new double[] { 3, 3, 4, 5 });

ヒープ上にの新しいインスタンスを作成し、そのアドレスを変数Vectorに割り当てます。その後、新しい完全に異なるオブジェクトを指します。test2test2

対照的に、ライン

test2[1] = 4;

test2変数自体 (ヒープ上のオブジェクトへの参照) は変更しません。むしろ、それが指すオブジェクトを変更しています。test2まだヒープ上の同じ場所を参照しています。

要約すると、前者では参照を変更し、後者では参照先を変更しています

于 2010-01-07T05:46:04.233 に答える
1

次のような変数を割り当てると:

test2 = new Vector(new double[] { 3, 3, 4, 5 });

test2 の値を、代入演算子の右側から返される新しい参照に変更しています。もちろん、ここで返される参照は の参照とは異なりますtest1。これは、コンストラクターが呼び出される別のケースであり、Vector が異なる引数で構築されているため、参照が同じである可能性はありません。

于 2010-01-07T05:46:37.180 に答える
0
Vector test1 = new Vector(new double[] { 6, 3, 4, 5 });

ベクトル自体とそれへの参照の 2 つのオブジェクトを作成しています。

ページにアイテムのリストがあると想像してください。

使用するnew Vectorと、ベクトルを含むページに新しい行を効果的に記述できます。

オブジェクト

  1. {1,2,3,4,5}

最初のページを参照する参照 (Vector test1 = new Vector) と (test2 = test1) のリストもあります。

参考文献

  1. テスト1-> 1
  2. テスト2-> 1

「test2 = new Vector {5,4,3,2,1}」と言うと、最初のページに新しいベクター オブジェクトが作成され、test2 が参照しているベクターが変更されます。

オブジェクト

  1. {1,2,3,4,5}
  2. {5,4,3,2,1}

参考文献

  1. テスト1 -> 1
  2. テスト2 -> 2

2 番目の例では、test1 と test2 の両方がまだ同じオブジェクトを指しているため、テストが成功します。

于 2010-01-07T06:04:15.760 に答える
0

はい、new 演算子を使用して新しいオブジェクトを定義すると、古い代入は無効になります。

あなたのベクトルは参照型ですが、test2 = something と言うと、「今、test2 は何か他のものを指している」と言っています。

余談ですが、同じ内部値を持つ 2 つの異なる Vector オブジェクトを等しいと見なしたい場合は、Vector クラスに IEquatable を実装することでそれを取得できますが、それは別の問題です...

于 2010-01-07T05:47:05.807 に答える
0

Equals値を比較して一致するかどうかを確認しますが、参照を比較する場合は を使用する必要がありますReferenceEquals

http://msdn.microsoft.com/en-us/library/dd183752.aspxをチェックしてください

于 2010-01-07T05:53:03.610 に答える