有人错误的把string当成值类型而分析成值类型与引用类型的不同.我们知道string其实是引用类型.
其实只要ILDASM一下macorlib.dll 可以找到一些线索. 我们知道对于 ==和!=这对运算符,其实是跟Equals()方法挂钩的,只要看看Equals()中发生的事情,就一些都明白了:
.method public hidebysig static bool Equals(string a, string b) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: bne.un.s L_0006
L_0004: ldc.i4.1
L_0005: ret
L_0006: ldarg.0
L_0007: brfalse.s L_000c
L_0009: ldarg.1
L_000a: brtrue.s L_000e
L_000c: ldc.i4.0
L_000d: ret
L_000e: ldarg.0
L_000f: ldarg.1
L_0010: call bool string::EqualsHelper(string, string) //这个EqualsHelper判断是2个参数否含有相同的字符集
L_0015: ret
}
可以看到string重写了Object的Equals()方法,string.Equals()首先判断是否指向同一个地址,如果是,则返回true,如果不是,再判断是否2个字符串都不为空并含有相同的字符集,如果是,返回true,如果不是返回false.
而object的Equals()方法:调用了同名实例方法,同名实例方法又调用了InternalEquals 在这里调用结果最后是比较地址.
于是,对于具有相同字符集而位于2个不同内存位置的2个字符串,就出现了上面的结果.