默认情况下,==运算符是如何为字符串工作的
本文关键字:字符串 工作 情况下 运算符 默认 | 更新日期: 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
是一种更可靠的比较方式,它还可以处理不同的字符集和大小写敏感度。