下面这段代码:
   string a="hello";
   string b=string.Copy(a);
   string c="hello";
   Console.WriteLine((object)a==(object)b);
   console.Writeline((object)a==(object)c);
   输出是:
   false
   true
   为什么是这个结果?

解决方案 »

  1.   

    对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
      

  2.   

    因为二个都被强制转换成了Object,所以都算做一般的对像,所以就出现了上面的结果如果把Object去掉,就都是True了
      

  3.   

    string b和c有什么不同么?为什么结果不一样
      

  4.   

    “hello”是常量,在编译时,a和c指向了相同的地址,就是说a和c时相同的引用。有程序为证:
    object a="hello";
    object c="hello";
    Console.WriteLine(a==c);结果true
      

  5.   

    .net编译的程序一般由il代码,元数据、资源等组成。string a="hello";可以看到这两行il代码
    ldstr "hello"
    stloc.0
    object c="hello";则对应以下il代码:
    ldstr "hello"
    stloc.1
    可以看到决定因素在于ldstr "hello"。
    以下是msdn对ldstr的描述:ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。ldstr 指令分配必需的内存量并执行将字符串从在文件中使用的形式转换为在运行时要求的字符串格式所需的任何格式转换。公共语言结构 (CLI) 保证两个 ldstr 指令(这两个指令引用具有相同字符序列的两个元数据标记)的结果返回完全相同的字符串对象(称作“字符串限定”的进程)。