Вернуть переменную, как только она будет установлена ​​на определенное значение. Перегрузка равенства - PullRequest
1 голос
/ 25 марта 2011

Я перегружаю метод Equality для сравнения значений и мне было интересно, есть ли чистый способ вернуть false, как только одно из сравнений значений вернет false Например, вот основная идея:

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 s больше не производится сравнение значений. Это кажется очень повторяющимся, неуклюжим и (что наиболее важно) ужасным для удобства чтения. Я хочу знать, можно ли каким-либо образом уменьшить этот код до того же эффекта без использования оператора &&.

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Вы можете воспользоваться природой короткого замыкания логического оператора AND (&&), например:

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

Как только любое из сравнений оценивается как ложное, все условие оценивается как ложное. Если все три верны, условие возвращает истину.

1 голос
/ 25 марта 2011

Использование и условие:

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

&& по умолчанию реализует короткое замыкание.

0 голосов
/ 25 марта 2011

Другой способ мог бы сделать это:

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

Вопрос выбора, я полагаю.Я думаю, что && один более читабелен ..

...