引文: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了.