美文网首页
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#重载运算符

    C#中比较运算符的重载 == and != ; > and <; >= and <=. c#中要求比较运算符的重载...

  • C# 第三节

    C# 运算符重载 您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算...

  • 10-25学习总结

    今天继续学习了C#第四章 1.运算符重载 运算符也是C#类的一个重要成员,系统对大部分运算符都给出了常规定义,这些...

  • 运算符重载及其他约定

    7.1 重载算术运算符 重载二元算术运算符 重载复合赋值运算符 重载一元运算符 重载比较运算符 等号运算符:‘eq...

  • C++ 部分运算符重载

    可重载的运算符 不可重载的运算符和符号 重载运算符为类的成员函数 重载运算符为友元函数 重载赋值运算符 重载流插入...

  • 2019-07-11 运算符的重载

    运算符的重载 重载运算符 (“::”,“.*”,“.”,“?:”)不能被重载。 重载运算符时,不能改变其本质,如不...

  • 运算符重载

    一.+号运算符重载 二.<<号运算符重载 三.指针运算符重载(智能指针)

  • C++运算符重载-下篇 (Boolan)

    C++运算符重载-下篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++运算符重载-上篇 (Boolan)

    C++运算符重载-上篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++重载

    重载 C++语言规定: 重载的运算符要保持原运算符的意义。只能对已有的运算符重载,不能增加新的运算符。重载的运算符...

网友评论

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

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