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类型重载的内容比较逻辑。第一个比较
.NET存在字符串驻留池机制:编译期就能确定的相同字符串字面量,会被自动存入全局的字符串驻留池,同值的字面量只会在池里保留一份实例。代码中的v1 == v2返回true的原因v1和v2都是通过字面量"Hallo"赋值,二者指向驻留池中的同一个字符串对象,因此引用相等比较结果为true。第二个比较
v1 == v4返回false的原因v4是通过new string(v3)在运行时动态生成的字符串,默认情况下运行时动态创建的字符串不会自动加入驻留池,因此它是堆上独立的全新对象实例。即便它的字符串内容和v1完全一致,引用地址和v1不同,因此引用相等比较结果为false。
正确按内容比较字符串的方案
如果需要判断两个字符串的内容是否相等,不受变量声明类型影响,可使用两种写法:
- 先将变量强转为
string类型后再用==比较:(string)v1 == (string)v4 - 直接调用字符串静态Equals方法:
string.Equals(v1, v4)
内容的提问来源于stack exchange,提问作者David Mason
相关产品推荐
相关产品推荐

