string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo").Append("bar").ToString(); var k = foobar2 == foobar;//true 比较的是2个引用类型的值是否相等 var b = System.Object.ReferenceEquals(foobar, foobar2);//false比较的是内存的引用 var p = foobar.Equals(foobar2);//true 比较是2个引用类型的引用是否相等
一:Object.ReferenceEquals
与不同Equals方法和相等运算符,ReferenceEquals不重写方法。 因此,如果你想要测试两个对象是否相等的引用和你不确定的实现Equals方法时,你可以调用ReferenceEquals方法。
比较值类型。 如果objA和objB是值类型,它们先它们传递给装箱ReferenceEquals方法。 这意味着,如果这两个objA和objB表示值类型,同一个实例ReferenceEquals方法尽管如此返回false
当比较字符串。 如果objA和objB都是字符串,ReferenceEquals方法返回true
二:Object.Equals
如果当前实例是引用类型,Equals(Object)方法测试引用相等性,并调用Equals(Object)方法等效于调用ReferenceEquals方法。 引用相等性意味着进行比较的对象变量引用同一个对象。
如果当前实例是值类型,Equals(Object)方法测试值是否相等
Object.ReferenceEquals 和Object.Equals
第一个是引用比较,第二个就是比较两个对象是否相同.
区别是,第一个肯定是比较引用的,所以无法被重写,只要是两个new出来的对象,那么肯定是false
而第二个则允许对象重写比较函数,默认是比较引用(同前一个一样),但对象重写后,可以实现自己的比较规则,也就是比较内容是否相同.