我知道这是一个特殊情况,但为什么在字符串之间使用==时,它返回它们的值是否相等而不是引用是否相等。这与重载运算符有关吗?
==
操作符在 String
中被重载,用于执行值相等性而不是引用相等性。这个想法是使字符串更加友好,避免使用引用相等性来比较它们时出现的错误(在 Java 中并不罕见,尤其是对于初学者来说)。
老实说,到目前为止我从未需要按引用比较字符串。如果你需要这样做,可以使用object.ReferenceEquals()
。
由于字符串是不可变的,运行时可能选择将具有相同内容的任何两个字符串放在同一个引用中。因此,对字符串进行引用比较实际上没有任何意义。
operator ==
执行值比较的问题。 - Konrad Rudolph是的。从.NET Reflector中,这是String
类的等号运算符重载:
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
等号运算符 (==
和 !=
) 的作用是比较字符串对象的值,而不是引用。
我在任何情况下都没有必要比较引用,但如果你想这样做,可以使用以下方法:
object.ReferenceEquals().
在字符串中,==是通过值比较的(value)
“虽然字符串是引用类型,但等式运算符(==和!=)被定义为比较字符串对象的值,而不是引用(7.9.7字符串等式运算符)。这使得测试字符串相等更加直观。”
简而言之,在字符串上,==是通过值比较字符串,而不是通过引用比较,因为C#规范规定应该这样做。
if (name == "jim")
而不是if (name.ValueEquals("jim"))
。 - Jim Mischel==
运算符时总是进行值相等性比较,而需要一个特殊的运算符/方法来进行引用相等性比较,而不是反过来。通常情况下,我更经常比较值而不是引用(除非在处理引用时)。 - Joey