想知道为什么String在使用==时表现得像值类型。
String s1 = "Hello";
String s2 = "Hello";
Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different)
Console.WriteLine(s1.Equals(s2));//True
StringBuilder a1 = new StringBuilder("Hi");
StringBuilder a2 = new StringBuilder("Hi");
Console.WriteLine(a1 == a2);//false
Console.WriteLine(a1.Equals(a2));//true
StringBuilder和String与==运算符的行为不同。 感谢。
答案 0 :(得分:18)
两个不同的原因;
"Hello"
字符串已编译到源代码中,因此 相同的引用 - 检查ReferenceEquals(s1,s2)
- 它将返回true
==
/ !=
(又名op_Equality
/ op_Inequality
) StringBuilder
版本失败,原因是:
StringBuilder
没有运营商在每个上调用ToString()
,它会变得更有趣:
true
答案 1 :(得分:8)
==
运算符在String
类中重载,其方式是使字符串值进行比较而不是对象引用,这是默认值。
答案 2 :(得分:3)
因为==运算符被重新定义为字符串。
请参阅MSDN
答案 3 :(得分:0)
这是因为已经重写了相等运算符以提供您看到的功能。您可以通过覆盖equals运算符在任何类型上执行此操作。
答案 4 :(得分:-2)
使用==表示字符串是不好的做法,只需使用Equals()。