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

jav*_*red 2 .net c# string equals string-comparison

可能重复:
在字符串的情况下,请告诉我为什么两个引用对于字符串对象是相同的(代码如下)

当我在C#s1 == s2中写入时,两者都声明为字符串,编译器会比较引用或内容吗?即如果==是为string班级重写?

我只是想知道为什么这段代码打印"true":

string s1 = "hello"
string s2 = s1 + " ";
s2 = s2.Trim(); // i expect new object here
Console.WriteLine(s2 == s1);
Run Code Online (Sandbox Code Playgroud)

此外,我还有一些第三方来源,==通常用于字符串比较.这让我很疯狂,因为我几乎从不==用来比较Java中的字符串,现在我无法理解这段代码是如何工作的.

==用于比较C#中的字符串是否正常?

upd:多亏了所有,几乎所有答案都是正确的.总结:

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

此行为与Java不同,其中String类的"=="比较引用.

另请参阅为什么字符串不能比较引用?

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

注意它是如何在完全相同的对象上操作的,但是因为重载解析是在编译时执行的,所以在第二种情况下编译器不知道调用特定于字符串的操作符.