this article에 따르면 Equal (Thing)을 다음과 같이 수반했습니다.비교 연산자를 디자인 할 때 StackOverflow
문제점은 연산자 재 정의를 추가하기 전에 작동하고 있지만 이제는 StackOverflowException이 발생합니다. 내가 뭘 놓치고 있니? 당신이 Thing
의 비교하는 ==
연산자를 정의 후에는 someThing == null
을 말할 때, 그 사용됩니다
this article에 따르면 Equal (Thing)을 다음과 같이 수반했습니다.비교 연산자를 디자인 할 때 StackOverflow
문제점은 연산자 재 정의를 추가하기 전에 작동하고 있지만 이제는 StackOverflowException이 발생합니다. 내가 뭘 놓치고 있니? 당신이 Thing
의 비교하는 ==
연산자를 정의 후에는 someThing == null
을 말할 때, 그 사용됩니다
는, 그러나 거기에, 그래서 여기에 나는이 경우에하고 싶습니다 다른 점이다 내가 그것을 구현하는 것이 방법입니다 동일한 기준을 사용하여
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 원칙의 구현입니다.
. 마찬가지로 !=
.
그렇다면 self == other
이라고 말하면 operator ==(self, other)
으로 전화를 겁니다. 귀하의 기준 중에 operator !=(self, null)
을 호출하는 self != null
이 있습니다 ... self == null
을 확인하여 operator ==(self, null)
을 호출하고 스택 공간이 부족할 때까지 이동하십시오.
참조 비교를 위해 object
에 자료를 전송하여이 문제를 해결할 수 있다고 확신합니다. 또는 Object.ReferenceEquals(self, null)
등을 말하면 ==
에 의존하지 않으므로 재귀를 얻지 못할 수 있습니다.
한 곳에서의 변화 만이 부드러움을 봅니다. 그러나, 당신은 * 돌아 오는 ReferenceEquals (self, other)에 대해 어떻게 느끼겠습니까? self? .dd == other? .Id; * 같음 및 * 반환! ReferenceEquals (self, other) || 자기?. 그럴 래. = 다른?. 불평등을 위해서? –
나는 같음 연산자를 구현하기로 선택했지만 평등 연산자가 아닌 단순히 같음 연산자를 구현하는 것이 더 좋습니다. 이것이 내 대답의 요점입니다. 두 번 구현할 수있는 것은 단 한 번만 구현할 수 있습니다. –
@KonradViltersten : 당신의 논리가 조금 엉망이 된 것처럼 보입니다. '! a || b는'! (a || b)'와 같지 않습니다. (이유 # 7 왜 하나의 장소에서 로직을 가지고 있고 다른 모든 것들을 참조하는 것이 더 낫다. :) – cHao