2016-08-10 2 views
2

this article에 따르면 Equal (Thing)을 다음과 같이 수반했습니다.비교 연산자를 디자인 할 때 StackOverflow

문제점은 연산자 재 정의를 추가하기 전에 작동하고 있지만 이제는 StackOverflowException이 발생합니다. 내가 뭘 놓치고 있니? 당신이 Thing의 비교하는 == 연산자를 정의 후에는 someThing == null을 말할 때, 그 사용됩니다

답변

3

는, 그러나 거기에, 그래서 여기에 나는이 경우에하고 싶습니다 다른 점이다 내가 그것을 구현하는 것이 방법입니다 동일한 기준을 사용하여

public static bool operator ==(Thing self, Thing other) 
{ 
    return !ReferenceEquals(self, null) && 
      !ReferenceEquals(other, null) && 
      self.Id == other.Id; 
} 

public static bool operator !=(Thing self, Thing other) 
{ 
    return !(self == other); 
} 

스택 오버 플로우가 발생하지 않습니다 예외는 연산자 ==/!=을 사용하지 않기 때문에 != 연산자를 구현하면 연산자의 !을 반환하기 만하면 평등 테스트가 변경되는 경우 유지 보수가 저장됩니다. 이것은 DRY 원칙의 구현입니다.

+0

한 곳에서의 변화 만이 부드러움을 봅니다. 그러나, 당신은 * 돌아 오는 ReferenceEquals (self, other)에 대해 어떻게 느끼겠습니까? self? .dd == other? .Id; * 같음 및 * 반환! ReferenceEquals (self, other) || 자기?. 그럴 래. = 다른?. 불평등을 위해서? –

+0

나는 같음 연산자를 구현하기로 선택했지만 평등 연산자가 아닌 단순히 같음 연산자를 구현하는 것이 더 좋습니다. 이것이 내 대답의 요점입니다. 두 번 구현할 수있는 것은 단 한 번만 구현할 수 있습니다. –

+0

@KonradViltersten : 당신의 논리가 조금 엉망이 된 것처럼 보입니다. '! a || b는'! (a || b)'와 같지 않습니다. (이유 # 7 왜 하나의 장소에서 로직을 가지고 있고 다른 모든 것들을 참조하는 것이 더 낫다. :) – cHao

5

. 마찬가지로 !=.

그렇다면 self == other이라고 말하면 operator ==(self, other)으로 전화를 겁니다. 귀하의 기준 중에 operator !=(self, null)을 호출하는 self != null이 있습니다 ... self == null을 확인하여 operator ==(self, null)을 호출하고 스택 공간이 부족할 때까지 이동하십시오.

참조 비교를 위해 object에 자료를 전송하여이 문제를 해결할 수 있다고 확신합니다. 또는 Object.ReferenceEquals(self, null) 등을 말하면 ==에 의존하지 않으므로 재귀를 얻지 못할 수 있습니다.

나는 완전히 차오의 대답에 동의
관련 문제