2011-03-25 3 views
1

값 비교를 위해 Equality 메서드가 오버로드되고 값 비교 중 하나가 false를 반환하면 false을 반환하는 명확한 방법이 있는지 궁금합니다. 변수가 특정 값으로 설정 되 자마자 변수를 반환하십시오. Equality 오버로드

public class MyClass 
{ 
    private int _valOne; 
    private int _valTwo; 
    private int _valThree; 

    public MyClass(int valOne, int valTwo, int valThree) 
    { 
     _valOne = valOne; 
     _valTwo = valTwo; 
     _valThree = valThree; 
    } 

    public override bool Equals(object obj) 
    { 
     // If the object is null return false 
     if (obj == null) 
     { 
      return false; 
     } 

     // If the object is not of MyClass type return false 
     MyClass myClass = obj as MyClass; 
     if (myClass == null) 
     { 
      return false; 
     } 

     // Now compare all the field values 
     bool areEqual = false; 
     areEqual = (this._valOne == myClass._valOne); 
     areEqual = (this._valTwo == myClass._valTwo); 
     areEqual = (this._valThree == myClass._valThree); 

     return areEqual; 
    } 
} 

_valOne 년대가 동일하지 말 : 예를 들어, 여기에 기본적인 생각이다. 비교할 가장 효율적인 방법은 두 값이 같지 않다는 것을 알게 되 자마자 false을 반환하는 것입니다. 다음과 같은 뭔가 ...
 // Now compare all the field values 
     bool areEqual = false; 

     areEqual = (this._valOne == myClass._valOne); 
     if (!areEqual) 
     { 
      return false; 
     } 

     areEqual = (this._valTwo == myClass._valTwo); 
     if (!areEqual) 
     { 
      return false; 
     } 

     areEqual = (this._valThree == myClass._valThree); 

     return areEqual; 

이제 더 이상 값 비교가 만들어지는 _valOne의 비교 후. 이것은 매우 반복적이고, clunky하고, (가장 중요하게는) 가독성을 위해 끔찍한 것처럼 보입니다. 이 코드를 & & 연산자를 사용하지 않고도 동일한 효과로 깨끗하게 줄일 수있는 방법이 있는지 알고 싶습니다.

답변

1

사용 및 조건 :

areEqual = (this._valOne == myClass._valOne) 
    && (this._valTwo == myClass._valTwo) 
    && (this._valThree == myClass._valThree); 

& & 기본적으로 단락을 구현합니다.

+0

나는 이것을하는 것에 대해 생각했지만 여러 분야에서 나는 그것이 나빠질 수도 있다고 생각했다. 나는 그것이 효과적 일 것이라는 것을 깨닫고이 문제에 대한 유일한 해결책 일지 모르지만 당신이 생각할 수있는 다른 방법이 있습니까? – 7ogan

+0

유일한 다른 방법은 Raze2Dust의 다른 답변으로, 각 조건을 수동으로 "떨어 뜨려"거짓으로 되돌아 오는 즉시 반환하는 것입니다. && 연산자는 C# 논리 연산자의 단락 된 동작과 매우 유사한 작업을 수행합니다. – KeithS

5

이 같은 논리의 short-circuiting 자연과 (&&) 연산자를 이용할 수 있습니다

return this._valOne == myClass._valOne 
    && this._valTwo == myClass._valTwo 
    && this._valThree == myClass._valThree; 

는 즉시 비교 중 하나가 false로 평가로, 전체 조건이 false로 평가합니다. 세 조건 모두가 참이면 조건은 참을 반환합니다.

+0

내가 Raze2Dust에 말한 것처럼 ... && 연산자를 사용하는 것 외에 다른 방법이 있습니까? – 7ogan

+0

나는 그렇게 생각하지 않는다. 반성을 할 수 있을지 모르겠다. – BoltClock

+0

나는 어쨌든 reflection을 && 연산자보다 선호한다. 그래도 고마워. – 7ogan

0

또 다른 방법은이 작업을 수행 할 수 있습니다 :

if (this._valOne != myClass._valOne) 
     return false; 
    if (this._valTwo != myClass._valTwo) 
     return false; 
    if (this._valThree != myClass._valThree) 
     return false; 
    return true; 

것 같아요 선택의 문제. 나는 & & 하나가 더 읽을 수 있다고 생각한다.

관련 문제