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个变量则会另外处理。
本文通过示例详细介绍了C#中值类型、引用类型及字符串在使用==、Equals与ReferenceEquals进行比较时的区别。对于值类型,这些操作符比较的是值的相等性;对于引用类型,它们通常比较的是引用的相等性;而对于字符串,虽然也基于引用,但默认实现了值的比较,并探讨了字符串常量池的优化机制。

被折叠的 条评论
为什么被折叠?



