我有以下代码
CASE 1
string string1 = "pankaj";
string string2 = "pankaj";
Console.WriteLine(string1 == string2); // output TRUE
CASE 2
object obj1 = "pankaj";
object obj2 = "pankaj";
Console.WriteLine(obj1==obj2); // Output TRUE
CASE 3
object againObject1 = 2;
object againObject2 = 2;
Console.WriteLine(againObject1==againObject2); // Output FALSE
因为字符串和对象都是引用类型,对于引用类型,我了解到相等操作检查它们是否保持相同的地址,在上述两种情况下,为什么它的比较值而不是引用。
更令人困惑的是对于类型2中的对象类型的等于运算符的行为和对于字符串类型的情况3,它计算为true,对于整数,它返回false。
答案 0 :(得分:5)
字符串相等性不同。还有很多其他的事情......
示例1和2在两种情况下都会返回完全相同的对象 - INTERNED字符串(" pankaj"在内化后仅存在一次,所有常量字符串都被内化)。
示例3有2个盒装对象,没有任何优化 - 所以在值类型周围有2个框。
答案 1 :(得分:0)
字符串是对象和整数也是,但后者是type values。因此,示例3指向内存中的两个不同位置,您试图通过在对象上装箱来比较它们的地址。
答案 2 :(得分:-1)
String类已重写operator ==以便按值实现比较,而Int32类则没有。
答案 3 :(得分:-1)
使用: object1 ==对象2 不是比较对象的内容,而是比较存储地址, 如果对象具有可比性,则使用object1.equals(object2)