想知道为什么 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 使用 == 运算符的行为不同。 谢谢。
最佳答案
两个不同的原因;
- 实习 - 由于
"Hello"
字符串被编译到源代码中,它们是相同的引用 - 检查ReferenceEquals(s1,s2)
- 它将返回true
- 自定义相等 - 字符串具有相等运算符(特别是
==
/!=
(又名op_Equality
/op_Inequality
)
StringBuilder
版本失败,因为:
- 它们不是相同的引用(这些是在托管堆上单独创建的常规托管对象)
StringBuilder
没有运算符
对每个调用 ToString()
,它会变得更有趣:
- 这两个字符串不是相同的引用
- 但运营商支持保证
true
关于c# - 为什么 String 在使用 == 时表现得像值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700637/