【问题标题】:Return a variable as soon as it is set to a certain value. Equality overloading将变量设置为特定值后立即返回。等式重载
【发布时间】:2011-03-25 18:17:00
【问题描述】:

我正在重载 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;

所以现在在比较_valOnes 之后不再进行值比较。这似乎非常重复、笨拙,而且(最重要的是)可读性很差。我想知道是否有任何方法可以在不使用 && 运算符的情况下以干净的方式将这段代码简化为相同的效果。

【问题讨论】:

    标签: c# equals short-circuiting


    【解决方案1】:

    您可以利用逻辑 AND (&&) 运算符的 short-circuiting 特性,如下所示:

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

    只要任何一个比较结果为假,整个条件就会为假。如果三个都为真,则条件返回真。

    【讨论】:

    • 就像我对 Raze2Dust 所说的那样......除了使用 && 运算符之外还有其他方法吗?
    • 我不这么认为,不确定您是否可以为此使用反射。
    • 无论如何,我更喜欢 && 运算符而不是反射。不过,感谢您的回答。
    【解决方案2】:

    使用and条件:

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

    && 默认实现短路。

    【讨论】:

    • 我曾想过这样做,但有几个领域我认为它可能会失控。我知道它会起作用,并且可能是解决此问题的唯一方法,但是您还能想到其他方法吗?
    • 唯一的另一种方法是 Raze2Dust 的其他答案,手动“通过”每个条件并在返回错误时立即返回。 && 运算符的作用与 C# 逻辑运算符的短路行为非常相似。
    【解决方案3】:

    另一种方法是这样做:

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

    我猜是选择问题。我认为 && 更具可读性..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2016-11-25
      • 2022-01-22
      • 2013-01-27
      相关资源
      最近更新 更多