C#值类型、引用类型中的Equals和==的区别浅析

2019-12-26 11:10:51王旭

        }
    }
}

 

测试结果:

C#值类型、引用类型中的Equals和==的区别浅析

说明根据传入实参的类型,优先匹配最相近的形参列表的方法。

那么我们将Add(int a ,int b)这个方法注释掉,那么会调用哪个方法?

C#值类型、引用类型中的Equals和==的区别浅析

为什么花费那么多口舌说明上面的问题,那么现在看一下Int32反编译的代码:

C#值类型、引用类型中的Equals和==的区别浅析

Int32有一个自己的Equals方法,有一个重写的Equals方法,如果两个int类型的值进行比较,Equals和==是一样的,因为它优先调用了下面的Equals方法,如果是下面的代码,则会选择重写的Equals方法。

 

复制代码
static void Main(string[] args)
        {
            int a = 1;
            object b = 1;
            Console.WriteLine(a.Equals(b));
            Console.Read();
        }

 

可见,对于值类型的Equals和==是一样的。

引用类型

在类(引用类型)上,两种 Object.Equals(Object) 方法的默认实现均执行引用相等性比较,而不是值相等性检查。 当实施者重写虚方法时,目的是为了为其指定值相等性语义。
即使类不重载 == 和 != 运算符,也可以将这些运算符与类一起使用。 但是,默认行为是执行引用相等性检查。 在类中,如果您重载 Equals 方法,则应重载 == 和 != 运算符,但这并不是必需的。