11 区别对待==和Equals
无论是操作符"=="还是方法"Equals",都表示:
值类型,值相等则返回True;
引用类型,指向同一个对象即引用相等则返回True;
object a = 1; object b = 1; Console.WriteLine(a == b);//False b = a; Console.WriteLine(a == b);//True Console.ReadLine();
1. ReferenceEquals, == , Equals
Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等。
a) ReferenceEquals
ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false。(因为Box以后的对象总是不同的)
b) ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:
Int a = 100;
Double b =100;
If(a == b)
Console.WriteLine(“equal supports compare between different types!”);
上面这段程序将会输出:
equal supports compare between different types!
而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如:
Struct Userstruct1;
Userstruct1 a;
Userstruct1 b;
If(a == b)
Console.WriteLine(“can == reach this far?”)
上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。
对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于 系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。
c) Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。
对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。
对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。
int i = 1; double j = 1; Console.WriteLine(i == j);//True Console.WriteLine(i.Equals(j));//False
class Program { static void Main(string[] args) { TestChild m1 = new TestChild(); Test m2 = new TestChild(); Console.WriteLine(m1.a()); Console.WriteLine(m2.a()); Console.WriteLine(m1 == m2);//False Console.WriteLine(m1.Equals(m2));//False object m3 = 1; object m4 = 1; Console.WriteLine(m3 == m4);//False Console.WriteLine(m3.Equals(m4));//True int a3 = 1; int a4 = 1; Console.WriteLine(a3 == a4);//True Console.WriteLine(a3.Equals(a4));//True object m5 = "1"; object m6 = "1"; Console.WriteLine(m5 == m6);//True Console.WriteLine(m5.Equals(m6));//True Console.ReadKey(); } } public class Test { public virtual int a(Test t) { return 1; } public int a() { return 4; } } public class TestChild : Test { public override int a(Test t) { return 2; } public int a() { return 3; } }

浙公网安备 33010602011771号