对C#中的平等操作感到困惑

时间:2014-12-03 10:56:43

标签: c#

我有以下代码

 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。

4 个答案:

答案 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)