2017-05-05 6 views
0

이것은 Photo 클래스의 여러 하위 클래스의 객체로 채워진 이진 트리를 반복적으로 검색하는 방법입니다.두 개체가 동일한 경우 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!"); 
    } 
} 

'사진'은 다양한 인수와 속성 값으로 정의됩니다 (하위 클래스는 모두 동일한 종류의 인수와 속성을 가지고있는 것은 아닙니다). 사용자가 새 사진을 입력하면 모든 인수와 속성이 기존 사진과 완전히 동일하므로이 메서드는이를 인식하고 예외를 throw합니다.

문제는 발생하지 않습니다. 디버깅을 할 때 두 개의 객체가 정확히 동일하더라도 프로그램이 전제 current.content.Equals(searched)에 절대로 할당하지 못하는 것처럼 보였습니다.

무엇이 문제 일 수 있습니까?

+4

참조 동등성과 값 동등성의 차이점을 찾으십시오. –

+1

당신의'equals' 메쏘드는 어떻게 구현되어 있습니까? 기본값은'GetHashCode'가 같은지 검사합니다. 두 개의 다른 객체에는 해시 코드가 없습니다. – Loetn

+1

왜 처음에는'ref'를 사용하는지 명확하지 않습니다 ... 또한 "당신이 스스로 잡는 예외를 던지십시오"접근법을 사용하는 것을 강력히 피할 것입니다. 제안을 넘어서 문제를 재현 할 수 있도록 [mcve]를 제공해주십시오. –

답변

7

Photo 클래스의 Equals() 메서드를 재정의하여 설명 된 속성 비교를 수행하지 않으면 코드에서 개체 참조 동일성 비교를 수행합니다.

이렇게하면 속성이 동일한 경우 Equals() 메서드가 false을 반환하는 이유가 설명됩니다.