通过比较两个结构==(Comparing two structs using ==)

2019-07-20 22:07发布

我想比较使用在C#中的equals(==)两个结构。 我的结构低于:

public struct CisSettings : IEquatable<CisSettings>
{
    public int Gain { get; private set; }
    public int Offset { get; private set; }
    public int Bright { get; private set; }
    public int Contrast { get; private set; }

    public CisSettings(int gain, int offset, int bright, int contrast) : this()
    {
        Gain = gain;
        Offset = offset;
        Bright = bright;
        Contrast = contrast;
    }

    public bool Equals(CisSettings other)
    {
        return Equals(other, this);
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        var objectToCompareWith = (CisSettings) obj;

        return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast &&
               objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset;

    }

    public override int GetHashCode()
    {
        var calculation = Gain + Offset + Bright + Contrast;
        return calculation.GetHashCode();
    }
}

我想有结构作为我的阶级属性,并要检查,看是否结构等于我想为它分配到,我继续前进,这样做之前的价值,所以我不表示属性改变了没有,像这样的时候:

public CisSettings TopCisSettings
{
    get { return _topCisSettings; }
    set
    {
        if (_topCisSettings == value)
        {
            return;
        }
        _topCisSettings = value;
        OnPropertyChanged("TopCisSettings");
    }
}

然而,在这里我检查相等行,我得到这个错误:

运算符“==”不能被应用于类型“CisSettings”的操作数和“CisSettings”

我想不通为什么发生这种情况,可能有人点我在正确的方向?

Answer 1:

你需要重载==!=运算符。 添加到您的struct

public static bool operator ==(CisSettings c1, CisSettings c2) 
{
    return c1.Equals(c2);
}

public static bool operator !=(CisSettings c1, CisSettings c2) 
{
   return !c1.Equals(c2);
}


Answer 2:

当你重写.Equals法, ==操作符不会自动超载。 你需要做的是明确的。

另见准则忽略equals()和==操作符 。



Answer 3:

你不明确实现的等号操作符 ,所以==是不是该类型特别规定。



Answer 4:

你应该重载你的操作是这样的一些方法:

public static bool operator ==(CisSettings a, CisSettings b)
{
    return a.Equals(b);
}


Answer 5:

你需要重写==操作符明确。

public static bool operator ==(CisSettings x, CisSettings y) 
{
   return x.Equals(y);
}

顺便说一句,你最好把比较的代码在public bool Equals(CisSettings other)并让bool Equals(object obj)调用bool Equals(CisSettings other)这样就可以得到避免不必要的类型检查的一些性能。



Answer 6:

你必须重载“==”运营商,也是超载“!=”操作符。 ( 看这注 )

对于重载运营商, 看到这个页面



文章来源: Comparing two structs using ==