为什么字符串不能比较引用?

我知道这是特殊情况,但为什么==如果它们的值等于字符串,则返回字符串,而不是当它们的引用等于时。 它是否与重载运算符有关?

实际上, ==运算符在String重载以执行值相等而不是引用相等。 我们的想法是让字符串对程序员更友好,并避免在使用引用相等性来比较它们时出现的错误(在Java中并不常见,特别是对于初学者而言)。

到目前为止,我从来没有需要通过引用比较字符串,说实话。 如果需要,可以使用object.ReferenceEquals()

因为字符串是不可变的,并且运行时可以选择将具有相同内容的任何两个字符串放在同一个引用中。 所以参考比较字符串实际上没有任何意义。

是。 从.NET Reflector这里是String类的等于运算符重载:

 public static bool operator ==(string a, string b) { return Equals(a, b); } 

在字符串上,==按值进行比较

“尽管string是一个引用类型,但是相等运算符(==和!=)被定义为比较字符串对象的值,而不是引用(7.9.7字符串相等运算符)。这使得对字符串相等性的测试更加直观。”

简而言之,== on strings比较字符串的值,而不是引用,因为C#规范说它应该。

等于运算符( ==!= )被定义为比较字符串对象的 ,而不是引用。

没有任何情况我必须比较引用,但如果你想这样做,那么你可以使用:

 object.ReferenceEquals().