可能重复:
Please tell why two references are same for string object in case of string( Code written below)
当我在C#s1 == s2
中写入时,两者都声明为字符串,编译器会比较引用或内容吗?即如果==
类被覆盖string
?
我只是想知道为什么这段代码会打印“true”:
string s1 = "hello"
string s2 = s1 + " ";
s2 = s2.Trim(); // i expect new object here
Console.WriteLine(s2 == s1);
此外,我还有一些第三方来源==
经常用于字符串比较。这让我很疯狂,因为我几乎从不使用==
来比较Java中的字符串,现在我无法理解这段代码是如何工作的。
使用==
比较C#中的字符串是否正常?
upd:感谢所有人,几乎所有答案都是正确的。 总结:
此行为与Java不同,其中String类的“==”比较引用。
另见Why strings does not compare references?
在我个人看来语言不应该允许覆盖或重载==运算符,因为它使它像c ++一样困难:)
答案 0 :(得分:7)
操作符不能重写多态,但它们可能重载,这就是字符串的情况。过载检查内容相等(以序数方式,没有文化敏感性)。所以,例如:
string s1 = "hello";
string s2 = (s1 + " ").Trim();
object o1 = s1;
object o2 = s2;
Console.WriteLine(s1 == s2); // True - calls overloaded ==(string, string)
Console.WriteLine(o1 == o2); // False - compares by reference
注意这是如何在完全相同的对象上运行,但因为重载解析是在编译时执行的,在第二种情况下,编译器不知道调用字符串特定的运算符。
答案 1 :(得分:3)
是的,默认情况下,当你使用==它检查引用等同性时,它会被字符串重写,以便它检查内容(因为字符串也是不可变的)
This is great article that I like(作者Jon也在这里:))
答案 2 :(得分:0)
即使System.String类是引用类型('string'是别名),也会覆盖该类型的==操作方法,以提供字符串类型内容之间的比较。
它们在您的示例中是相同的,因为字符串类型的内容是相同的。
答案 3 :(得分:0)
s2 == s1会给你一个布尔结果,是的。至于.NET编程,我总是发现使用String.Compare更好。
答案 4 :(得分:0)
是的,将C#中的字符串与==
进行比较是正常的(但不一定是好的做法)。 String.Compare
是一种更可靠的比较方式,它还可以处理不同的字符集和区分大小写。