真不好意思,关于小猪妹(妖精)的

引文:http://www.cnblogs.com/pigangel/archive/2004/03/22/3895.aspx

在CSDN上的问题: http://expert.csdn.net/Expert/topic/2902/2902022.xml?temp=.5561487

在这里重新说明一下:


using System;

namespace ConsoleApplication1
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 class Class1
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   string s = "Test";
   string t = string.Copy(s);
   Console.WriteLine(s == t);
   Console.WriteLine(((object)s).ToString ());
   Console.WriteLine(((object)s).GetHashCode());
   Console.WriteLine(((object)t).GetHashCode());
   Console.WriteLine(((object)s).Equals (((object)t)));
   Console.WriteLine((string)s == (string)t);
   Console.WriteLine((object)s == (object)t);

   t = "Test";
   Console.WriteLine((object)s == (object)t);
   t=t+"d";
   t=t.Substring(0,t.Length-1);
   Console.WriteLine((object)s == (object)t);
   Console.ReadLine();
  }

 }
}

问题是:
第一部分:
t = "Test";
Console.WriteLine((object)s == (object)t);
返回True

第二部分
t=t+"d";
t=t.Substring(0,t.Length-1);
Console.WriteLine((object)s == (object)t);
Console.ReadLine();
是对字符串操作了之后,重新得值.结果是False

还有一点:在跟踪(object)s == (object)t 时候,总是显示True,


偶的答案是:
输出数据时,有些让人容易疑惑的地方:

t = "Test";
Console.WriteLine((object)s == (object)t);
返回True

这是因为,字符串在处理时,如果没有进行操作,就直接指向那个内存地址值.
而在
t=t+"d";
t=t.Substring(0,t.Length-1);
Console.WriteLine((object)s == (object)t);
这里时,
由于字符串内容发生变化,所以,CLR会重新给t分配一块内存.
这时再用Console.WriteLine((object)s == (object)t);
比较时,就是False了,因为它们引用的内存地址不一样.

为什么在VS2002监视时,会是True呢?
其实也很简单.
是因为,VS2002它在Debug时,对于
(object)s == (object)t
中的
(object)s (或(object)t)
来说,里面只有一个String "Test"
也就是说(object)s能让VS2002看到的只有这么一个东西.
所以比较时,也就返回True了.







原文地址:https://www.cnblogs.com/sasbya/p/4892.html