string aa = "a";
string bb = "a";
if (aa == bb)
{
Console.Write("true");
}
else
{
Console.Write("FALSE");
}
Console.WriteLine(aa.Equals(bb));Console.ReadKey();
可是结果竟然全部是TRUE !!!!!!我从很多书上都看到过比较引用类型的时候不都比较的是引用地址么!!!!!!!!
至少有一个应该是FALSE吧
后来我又试了这个 Console.WriteLine(Object.ReferenceEquals(aa, bb));
仍然然没用啦 结果还是 TRUE
== 操作符比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址.
equals()方法比较的是两个对象指向的内存空间里的内容是不是相同.也就是比较两个"引用类型"是否是对同一个对象的引用.
aa 和 bb 的值在堆栈中是一样的,在栈中的内容也是一样的,aa和bb是对同一内容的引用
.NET中==跟Equals()内部机制完全是一样的,==是它的一个重载
public static bool operator ==(string a, string b)
{
return string.Equals(a, b);
}
具体可以参考一下http://terrylee.cnblogs.com/archive/2005/12/26/304876.html
主要问题在于,StringBuilder和String不是一个东西
这个是因为string 类的 == 操作符被重载了,不是简单的比较引用地址,而是先比较引用地址,如不引用地址不同再比较string 的内容。StringBuilder 则没有重载 == 操作符,所以只比较引用。
http://www.cnblogs.com/eaglet/archive/2009/05/13/1455994.html
另外你给的那个例子不典型,
string aa = "a";
string bb = "a";
aa 和 bb 连引用也是相同的,因为编译器会对这种情况默认进行字符串驻留。具体也请看我的那篇文章。
string在C#中可以看成是一个特殊的值类型, 所以你可以用==比较两个字符串的值,而 StringBuilder是一个对象, 当两个对象用==比较时,是比较两个对象的内存地址,你所述的问题中,两个StringBuilder都使用了new关键字,换句话说就是开辟了两个不同的内存空间,所以,当你用==号的时候,他们的内存地址不相同,返回就是false咯。
而StringBuilder aa = new StringBuilder("aa");
StringBuilder bb = aa;
这只是把aa的的内存地址赋值给bb,也可以说将bb的指针指向aa,所以你再用==判断的时候,内存地址就相同了,当然就返回true了。
而Equals是微软封装好的比较字符串对象的方法,它判断的就是两个内存地址中的值了。我们也可以通过实现IComparable接口,自定义Equeals的比较方式,来比较自定义对象。