You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:25:22