美文网首页
c#重载 == 运算符

c#重载 == 运算符

作者: 若水生花啊啊啊 | 来源:发表于2017-12-07 22:19 被阅读0次

    我们说过重载==符时,要override两个方法。
    1、bool Equals(object obj).
    2、int GetHashCode().

    但是为什么呢?前面已经说过,==的逻辑需要保持和bool Equals(object obj)的一致。但是又为什么要实现GetHashCode呢?
    因为在进行比较的时候,首先时比较其HashCode是否一致,不一致的话直接就不相等,不需要向下进行比较了,听说很快,如果一样再进行以下的比较。

     struct Vector
        {
            public double x, y, z;
    
            public Vector(double x, double y, double z)
            {
                this.x = x;
                this.y = y;
                this.z = z;
            }
    
            public Vector(Vector rhs)
            {
                x = rhs.x;
                y = rhs.y;
                z = rhs.z;
            }
            public override string ToString()
            {
                return "(" + x + "," + y + "," + z + ")";
            }
    
            public static Vector operator + (Vector lhs, Vector rhs)
            {
                Vector result = new Vector(lhs);
                result.x += rhs.x;
                result.y += rhs.y;
                result.z += rhs.z;
                return result;
            }
    
            public static bool operator ==(Vector lhs, Vector rhs)
            {
                if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            public static bool operator !=(Vector lhs, Vector rhs)
            {
                /*
                if (lhs.x != rhs.x || lhs.y != rhs.y || lhs.z != rhs.z)
                    return false;
                else
                    return true;
                    */
                return ! (lhs == rhs);
            }
            public override bool Equals(object obj)
            {
                Vector vector = (Vector)obj;
                if (x.Equals(vector.x) == true && y.Equals(vector.y) == true && z.Equals(vector.z) == true)
                    return true;
                else
                    return false;
            }
            public override int GetHashCode()
            {
                return (int)(x + y + z);
            }
        }
    

    值得理解的是在Equals的方法里,比较的base应该是这个类本身定义的元素,结构体变量的子元素都在定义的结构体里,因为是这个结构体定义的变量调用自身的Equals(object obj)方法来比较的。

    相关文章

      网友评论

          本文标题:c#重载 == 运算符

          本文链接:https://www.haomeiwen.com/subject/jdxsixtx.html