1. 对于值类型
int num1 = 1;
int num2 = 1;
Console.WriteLine(num1==num2);
Console.WriteLine(object.Equals(num1, num2));
Console.WriteLine(object.ReferenceEquals(num1, num2));
结果:
True
True
False
结论:对于值类型,==和Equals比较的是两个值是否相同,而ReferenceEquals比较的是两个值类型装箱后对象是否相同。
2.对于引用类型
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1 == obj2);
Console.WriteLine(object.Equals(obj1, obj2));
Console.WriteLine(object.ReferenceEquals(obj1, obj2));
结果:
False
False
False
结论:对于引用类型,==、Equals和ReferenceEquals比较的都是两个对象的地址是否相同。
3. 对于String
string target = "abc";
string a = "a";
string b = a + "bc";
string c = "a" + "bc";
Console.WriteLine(target == b);
Console.WriteLine(target == a + "bc");
Console.WriteLine(target == c);
Console.WriteLine();
Console.WriteLine(object.Equals(target, b));
Console.WriteLine(object.Equals(target, a + "bc"));
Console.WriteLine(object.Equals(target, c));
Console.WriteLine();
Console.WriteLine(object.ReferenceEquals(target, b));
Console.WriteLine(object.ReferenceEquals(target, a + "bc"));
Console.WriteLine(object.ReferenceEquals(target, c));
结果:
True
True
True
True
True
True
False
False
True
总结:对于string ==和Equals比较的是里面的字符串是否相同,而ReferenceEquals比较的是字符串地址是否相同,显而易见,前两组不用解释。
由于string是经常用到的,所有微软有一套优化机制,在编译过程中,如果确定内容相同的字符串会被指向同一内存空间。编译过程只会处理常量+常量的情况,若有1个变量则会另外处理。