对于字符串,==运算符默认如何工作?

时间:2011-04-14 10:01:52

标签: c# .net string equals string-comparison

  

可能重复:
  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:感谢所有人,几乎所有答案都是正确的。 总结:

  • 是的,使用“==”比较C#
  • 中的字符串是正常的
  • 字符串将按内容(非参考)进行比较
  • ==字符串的运算符不是虚拟的。
  • C#中的字符串是不可变的(这与Java类似)

此行为与Java不同,其中String类的“==”比较引用。

另见Why strings does not compare references?

在我个人看来语言不应该允许覆盖或重载==运算符,因为它使它像c ++一样困难:)

5 个答案:

答案 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是一种更可靠的比较方式,它还可以处理不同的字符集和区分大小写。