对 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。
字符串相等性是不同的。在许多其他事情中...
示例 1 和 2 在这两种情况下都将返回完全相同的对象 - INTERNED 字符串("pankaj"在内部化后仅存在一次,并且所有常量字符串都被内部化)。
示例 3 有 2 个未进行任何优化的盒装对象 - 因此值类型周围有 2 个框。
字符串是对象,整数也是,但后者是类型值。因此,示例 3 指向内存中的两个不同位置,您尝试通过在对象上将它们装箱来比较它们的地址。
使用:对象1==对象2不是比较对象的内容,而是比较存储地址,如果对象是可比较的,请使用 object1.equals(object2)
字符串类重写了运算符 == 以实现按值比较,而 Int32 类没有。