2017-05-05 2 views
0

これは、クラスPhotoのさまざまな子クラスのオブジェクトで満たされたバイナリツリーを再帰的に検索する方法です。2つのオブジェクトが同じであるときにC#コードが見つからないのはなぜですか?

public void SearchForIdentical(Photo searched) 
{ 
    SearchForIdentical(ref root, searched); 
} 

void SearchForIdentical(ref TreeNode current, Photo searched) 
{ 
    try 
    { 
     if(current != null) 
     { 
      if(current.content.Equals(searched)) 
      { 
       throw new PhotoAlreadyExistsException(searched); 
      } 
      SearchForIdentical(ref current.left, searched); 
      SearchForIdentical(ref current.right, searched); 
     } 
    } 
    catch (PhotoAlreadyExistsException e) 
    { 
     Console.WriteLine("This photo already exists! Try a new one!"); 
    } 
} 

'写真'は、さまざまな引数とプロパティの値によって定義されます(子クラスは必ずしもすべて同じ種類の引数とプロパティを持つわけではありません)。ユーザーが新しい写真を入力すると、そのすべての引数とプロパティーが既存のものと完全に同じになり、このメソッドはそれを認識して例外をスローします。

問題は起こりません。私がそれをデバッグしたとき、たとえ2つのオブジェクトがまったく同じであっても、プログラムは前提current.content.Equals(searched)に本当のことを割り当てないようでした。

何が問題なのですか?

+4

参照平等と値の平等の違いを調べます。 –

+1

'equals'メソッドはどのように実装されていますか?デフォルトでは、 'GetHashCode'が等しいかどうかがチェックされます。 2つの異なるオブジェクトは決して同じハッシュコードを持ちません。 – Loetn

+1

初心者のために 'ref'を使っている理由は明らかではありません...私はこの"あなたが自分自身を捕まえるという例外を投げる "ことを強く避けるでしょう。これらの提案以外にも、私たちが問題を再現できるように[mcve]を提供してください。 –

答えて

7

PhotoクラスのEquals()メソッドをオーバーライドして、記述したプロパティの比較を実行しない場合、コードはオブジェクト参照の等値比較を行います。

これは、プロパティが同一の場合、Equals()メソッドがfalseを返す理由を説明します。

関連する問題