• 两个string类型的变量str1和str2,str1==str2,而 (object)str1!=(object)str2 的原因


    刚刚在CSDN上看到有网友问这样的问题,的确对于不清楚底下的人这是很郁闷的.

    有人错误的把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个字符串,就出现了上面的结果.
  • 相关阅读:
    [LeetCode] Search a 2D Matrix
    CCBPM中的消息机制,CCIM服务端安装说明
    程序基石系列之C++多态的前提条件
    汇编中常见的一些错误信息
    浏览器的CSS Hacks
    易学设计模式看书笔记(7)
    [易飞]简易制程日报-月报
    js thiskeyword
    时空-问题集锦(转载)
    Delphi 组件渐进开发浅谈(二)——双简合璧
  • 原文地址:https://www.cnblogs.com/syeerzy/p/367939.html
Copyright © 2020-2023  润新知