对 C# 中的相等运算感到困惑

本文关键字:运算 | 更新日期: 2023-09-27 18:33:06

>我有以下代码

 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。

对 C# 中的相等运算感到困惑

字符串相等性是不同的。在许多其他事情中...

示例 1 和 2 在这两种情况下都将返回完全相同的对象 - INTERNED 字符串("pankaj"在内部化后仅存在一次,并且所有常量字符串都被内部化)。

示例 3 有 2 个未进行任何优化的盒装对象 - 因此值类型周围有 2 个框。

字符串是对象,整数也是,但后者是类型值。因此,示例 3 指向内存中的两个不同位置,您尝试通过在对象上将它们装箱来比较它们的地址。

使用:对象1==对象2不是比较对象的内容,而是比较存储地址,如果对象是可比较的,请使用 object1.equals(object2)

字符串类重写了运算符 == 以实现按值比较,而 Int32 类没有。