首页 新闻 会员 周边 捐助

关于 STRING 的 Equals 与 ==

0
悬赏园豆:10 [已关闭问题]

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

问题补充: StringBuilder aa = new StringBuilder("aa"); StringBuilder bb = new StringBuilder("aa"); Console.WriteLine(aa == bb); Console.WriteLine(aa.Equals(bb)); Console.WriteLine(Object.ReferenceEquals(aa, bb)); Console.ReadKey(); 可是,这个的结果确实 FALSE TRUE FALSE ,他们也是指向堆栈内存中的"aa"吧 如果将 StringBuilder bb = new StringBuilder("aa"); 改成StringBuilder bb = aa ; 其结果为 TRUE TRUE TRUE
wsenmin的主页 wsenmin | 初学一级 | 园豆:165
提问于:2009-08-14 15:11
< >
分享
其他回答(4)
0

== 操作符比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址.

equals()方法比较的是两个对象指向的内存空间里的内容是不是相同.也就是比较两个"引用类型"是否是对同一个对象的引用.

 

aa 和 bb 的值在堆栈中是一样的,在栈中的内容也是一样的,aa和bb是对同一内容的引用

小小小浩 | 园豆:140 (初学一级) | 2009-08-14 15:48
0

.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

slokra | 园豆:264 (菜鸟二级) | 2009-08-14 17:48
terrylee 写的不对,确实是重载,但不是这样重载的。具体看我的博客。
支持(0) 反对(0) eaglet | 园豆:17139 (专家六级) | 2009-08-14 19:03
我觉得应该是重载咯
支持(0) 反对(0) wsenmin | 园豆:165 (初学一级) | 2009-08-17 01:31
怎么给分,输入10以后提示说要输入一个正整数??
支持(0) 反对(0) wsenmin | 园豆:165 (初学一级) | 2009-08-17 01:33
0

主要问题在于,StringBuilder和String不是一个东西

Gray Zhang | 园豆:17610 (专家六级) | 2009-08-14 18:28
0

这个是因为string 类的 == 操作符被重载了,不是简单的比较引用地址,而是先比较引用地址,如不引用地址不同再比较string 的内容。StringBuilder 则没有重载 == 操作符,所以只比较引用。

http://www.cnblogs.com/eaglet/archive/2009/05/13/1455994.html

另外你给的那个例子不典型,

string aa = "a";
string bb = "a";

aa 和 bb 连引用也是相同的,因为编译器会对这种情况默认进行字符串驻留。具体也请看我的那篇文章。

eaglet | 园豆:17139 (专家六级) | 2009-08-14 19:02
0

string在C#中可以看成是一个特殊的值类型, 所以你可以用==比较两个字符串的值,而 StringBuilder是一个对象, 当两个对象用==比较时,是比较两个对象的内存地址,你所述的问题中,两个StringBuilder都使用了new关键字,换句话说就是开辟了两个不同的内存空间,所以,当你用==号的时候,他们的内存地址不相同,返回就是false咯。

而StringBuilder aa = new StringBuilder("aa");
StringBuilder bb = aa;

这只是把aa的的内存地址赋值给bb,也可以说将bb的指针指向aa,所以你再用==判断的时候,内存地址就相同了,当然就返回true了。

而Equals是微软封装好的比较字符串对象的方法,它判断的就是两个内存地址中的值了。我们也可以通过实现IComparable接口,自定义Equeals的比较方式,来比较自定义对象。

收藏、祢旳吻 | 园豆:205 (菜鸟二级) | 2009-08-15 15:44
string在C#中可以看成是一个特殊的值类型,说得好了,用string在C#中做比较得到的答案都和想象不一样呢
支持(0) 反对(0) wsenmin | 园豆:165 (初学一级) | 2009-08-17 01:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册