默认情况下,==运算符是如何为字符串工作的

本文关键字:字符串 工作 情况下 运算符 默认 | 更新日期: 2023-09-27 17:50:15

可能重复:
请说明为什么在字符串的情况下,字符串对象的两个引用是相同的(下面写的代码(

当我在C#s1 == s2中编写时,编译器会比较引用或内容吗?即,如果==string类覆盖?

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

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不同,Java中"=="for String类比较引用。

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

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

默认情况下,==运算符是如何为字符串工作的

运算符不能被以多态方式覆盖,但它们可以被重载(字符串就是这样(。重载检查内容是否相等(以有序的方式,不区分区域性(。例如:

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

请注意,这是如何在完全相同的对象上操作的,但由于重载解析是在编译时执行的,在第二种情况下,编译器不知道调用特定于字符串的运算符。

是的,默认情况下,当您使用==时,它会检查引用等同性,但它会覆盖字符串,以便检查内容(因为字符串也是不可变的(

这是我喜欢的一篇很棒的文章(作者Jon也在这里:(

即使System.String类是引用类型("String"是其别名(,该类型的==操作方法也会被覆盖,以提供字符串类型内容之间的比较。

在您的示例中,它们是相等的,因为字符串类型的内容是相同的。

s2==s1将给您一个布尔结果,是的。至于.NET编程,我一直觉得使用String.Compare.

更好

是的,将C#中的字符串与==进行比较是正常的(但不一定是好的做法(。String.Compare是一种更可靠的比较方式,它还可以处理不同的字符集和大小写敏感度。