请教一下关于==和equals的问题

qazliuzhou1 2012-04-02 01:11:42
在java中
String a = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
String b = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
System.out.print(a == b);
System.out.print(a.equals(b));

Object g = a;
Object h = b;
System.out.print(g == h);
System.out.print(g.equals(h));

输出结果为:false true false true

这个我理解

但在C#中,为什么

string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));

object g = a;
object h = b;
Console.WriteLine(g == h);
Console.WriteLine(g.Equals(h));

输出结果为:true true false true

是不是Java和C#的new机制不一样,求指教。。。谢谢
...全文
108 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qazliuzhou1 2012-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

string是引用类型
JAVA中貌似同object一样,单纯比较了引用
但C#中是这样处理的:引用相同或者非空且内容相同
C# code

public static bool operator ==(string a, string b)
{
return Equals(a, b);
}

//区别就在下面这个方法
public static bool Equals(stri……
[/Quote]
照你这么说,C#的String里==和equals不是没区别了,那样的话,第三个应该也是true,怎么变成了false。。
  • 打赏
  • 举报
回复
string被微软重写了=方法
引用类型默认情况下
=是比较的内存地址
equals一般比较的是有意义的值,这个由类的equals方法来定
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

如果两个都换成:
String a = "aa";
String b = "aa";
之类的,就是不用new,此时Java和C#的结果都是一样的,可以用堆栈来解释。可上面new出来的话就不一样了,是不是new机制问题?
[/Quote]

new了就是在堆里重新分配的对象,也就是a和b的引用不同,上面的代码就是string的==操作符机制,它调用了string类的Equals静态方法,而这个方法是下面这样的
//区别就在下面这个方法
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}

这个方法里的a==b是继承自object的,此时单纯比较引用,所以这里同JAVA一样,得到的是false。
但是C#还会继续比较后面的三个条件,由于内容相同,最后整个表达式的值为true
qazliuzhou1 2012-04-02
  • 打赏
  • 举报
回复
如果两个都换成:
String a = "aa";
String b = "aa";
之类的,就是不用new,此时Java和C#的结果都是一样的,可以用堆栈来解释。可上面new出来的话就不一样了,是不是new机制问题?
qazliuzhou1 2012-04-02
  • 打赏
  • 举报
回复
我想知道的是:为什么C#那个第一个是true
Java栈里按理说是分配到了两个不同的堆地址
此时为false
C#难道不一样吗?
  • 打赏
  • 举报
回复
string是引用类型
JAVA中貌似同object一样,单纯比较了引用
但C#中是这样处理的:引用相同或者非空且内容相同

public static bool operator ==(string a, string b)
{
return Equals(a, b);
}

//区别就在下面这个方法
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static unsafe bool EqualsHelper(string strA, string strB)
{
int length = strA.Length;
if (length != strB.Length)
{
return false;
}
fixed (char* str = ((char*) strA))
{
char* chPtr = str;
fixed (char* str2 = ((char*) strB))
{
char* chPtr2 = str2;
char* chPtr3 = chPtr;
char* chPtr4 = chPtr2;
while (length >= 10)
{
if ((((*(((int*) chPtr3)) != *(((int*) chPtr4))) || (*(((int*) (chPtr3 + 2))) != *(((int*) (chPtr4 + 2))))) || ((*(((int*) (chPtr3 + 4))) != *(((int*) (chPtr4 + 4)))) || (*(((int*) (chPtr3 + 6))) != *(((int*) (chPtr4 + 6)))))) || (*(((int*) (chPtr3 + 8))) != *(((int*) (chPtr4 + 8)))))
{
break;
}
chPtr3 += 10;
chPtr4 += 10;
length -= 10;
}
while (length > 0)
{
if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
{
break;
}
chPtr3 += 2;
chPtr4 += 2;
length -= 2;
}
return (length <= 0);
}
}
}
orochiheart 2012-04-02
  • 打赏
  • 举报
回复
哇 居然会出现这种情况 同问 为什么C#那个第三个是false

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧