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

C#中object类型存储的字符串比较结果一真一假问题求解

你执行的C#代码如下:

object v1 = "Hallo";
object v2 = "Hallo";

char[] v3 = { 'H', 'a', 'l', 'l', 'o' };
object v4 = new string(v3);

bool resultOfTwoObjectsThatAreActuallyStrings = v1 == v2;
bool anotherResultOfTwoObjectsThatAreAlsoStrings = v1 == v4;

Console.WriteLine("First result: " + resultOfTwoObjectsThatAreActuallyStrings);
Console.WriteLine("Second result: " + anotherResultOfTwoObjectsThatAreAlsoStrings);
结果差异原因

该现象由两个核心机制共同导致:C# ==运算符的绑定规则、.NET的字符串驻留机制。

  • ==运算符的比较逻辑规则

    C#中==的比较逻辑由变量的声明类型决定,而非运行时的实际类型:
    当变量声明类型为object时,==默认执行引用相等性比较,仅判断两个变量是否指向堆上的同一个对象实例,不会调用string类型重载的内容比较逻辑。
  • 第一个比较v1 == v2返回true的原因

    .NET存在字符串驻留池机制:编译期就能确定的相同字符串字面量,会被自动存入全局的字符串驻留池,同值的字面量只会在池里保留一份实例。代码中的v1和v2都是通过字面量"Hallo"赋值,二者指向驻留池中的同一个字符串对象,因此引用相等比较结果为true。
  • 第二个比较v1 == v4返回false的原因

    v4是通过new string(v3)在运行时动态生成的字符串,默认情况下运行时动态创建的字符串不会自动加入驻留池,因此它是堆上独立的全新对象实例。即便它的字符串内容和v1完全一致,引用地址和v1不同,因此引用相等比较结果为false。
正确按内容比较字符串的方案

如果需要判断两个字符串的内容是否相等,不受变量声明类型影响,可使用两种写法:

  1. 先将变量强转为string类型后再用==比较:(string)v1 == (string)v4
  2. 直接调用字符串静态Equals方法:string.Equals(v1, v4)

内容的提问来源于stack exchange,提问作者David Mason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:05