C#中String与Integer对象相等运算符行为差异原因咨询
为什么C#中装箱字符串用
==相等,装箱整数却不等? 先看你给出的代码示例:
using ConsoleApp1; object obj1 = "Hello"; object obj2 = "Hello"; object obj3 = 5; object obj4 = 5; Console.WriteLine(obj1 == obj2); // True Console.WriteLine(obj1.Equals(obj2)); // True Console.WriteLine(obj3 == obj4); // False // This should be true right? Console.WriteLine(obj3.Equals(obj4)); // True
造成这种差异的核心原因是**==运算符的行为逻辑**,以及C#对字符串和值类型装箱的特殊处理:
==的默认行为(object类型):当两个操作数都是object类型时,==默认比较的是对象引用——也就是两个变量是否指向内存中的同一个对象实例。字符串的特殊处理:字符串驻留池:
C#的CLR会维护一个字符串驻留池,所有直接写的字符串字面量(比如"Hello")都会被缓存到这个池里。当你第二次写"Hello"并赋值给obj2时,CLR不会新建对象,而是直接返回驻留池里已有的那个字符串引用。所以obj1和obj2指向的是同一个对象,==比较引用自然返回True。值类型装箱的特性:
int是值类型,当你把int赋值给object类型变量时,会触发装箱操作——每次装箱都会创建一个全新的System.Int32对象实例。obj3和obj4是两次独立装箱得到的不同对象,它们的引用地址不一样,所以用object的==比较引用就返回False。Equals方法的一致性:
不管是字符串还是值类型,它们都重写了object的Equals方法:- 字符串的
Equals比较的是字符内容; - 值类型的
Equals比较的是实际数值。
所以不管是字符串还是装箱的整数,Equals都会返回True。
- 字符串的
如果想让装箱后的整数用==也返回True,只需要把它们拆箱回值类型再比较:
Console.WriteLine((int)obj3 == (int)obj4); // True
内容的提问来源于stack exchange,提问作者Gowtham Raj
相关产品推荐
相关产品推荐

