C#中对象的四种相等比较方式如下:
1.ReferenceEquals(object o1, object o2):比较两个对象的引用,引用相同返回true,否则返回false,同为null是返回true;
2.Equals(object o):虚拟Equals方法,比较引用,可以重写比较值;
3.Equals(object o1, object o2):静态Equals方法,先判断两个对象是否为空,如果都不为空,则调用虚拟Equals方法;
4.object1 == object2:比较运算符,比较引用,可以重写;
注意:值类型比较时应采用重写后的Equals方法,使用ReferenceEquals进行值类型比较时总是返回false,因为两个值类型需要分别装箱到对象中,是不同的引用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Magic.Test.Operators
{
public class SomeClass
{
}
public class TestEquals
{
public static void Main()
{
SomeClass s1 = new SomeClass();
SomeClass s2 = new SomeClass();
SomeClass s3 = s1;
//ReferenceEquals比较两个对象的引用,同为null是返回true
Console.WriteLine("ReferenceEquals(s1, s2) : " + ReferenceEquals(s1, s2));
Console.WriteLine("ReferenceEquals(null, null) : " + ReferenceEquals(null, null));
Console.WriteLine("ReferenceEquals(s1, null) : " + ReferenceEquals(s1, null));
//虚拟Equals方法,比较引用,可以重写比较值
Console.WriteLine("s1.Equals(s2) : " + s1.Equals(s2));
Console.WriteLine("s1.Equals(s3) : " + s1.Equals(s3));
//静态Equals方法先比较两个对象是否为空,如果都不为空,则调用虚拟Equals方法
Console.WriteLine("SomeClass.Equals(s1, s2) : " + SomeClass.Equals(s1, s2));
Console.WriteLine("SomeClass.Equals(null, null) : " + SomeClass.Equals(null, null));
Console.WriteLine("SomeClass.Equals(s1, null) : " + SomeClass.Equals(s1, null));
//比较运算符比较引用,可以重写
Console.WriteLine("s1 == s2 : " + (s1 == s2));
Console.WriteLine("s1 == s3 : " + (s1 == s3));
//值类型比较
Console.WriteLine("1.Equals(1) : " + 1.Equals(1));
//ReferenceEquals进行值类型比较时总是返回false,因为两个值类型需要分别装箱到对象中,是不同的引用
Console.WriteLine("ReferenceEquals(1, 1) : " + ReferenceEquals(1, 1));
}
}
}
|