【发布时间】:2011-07-09 09:56:24
【问题描述】:
我知道这是特殊情况,但是为什么字符串之间的 == 如果它们的值相等而不是当它们的引用相等时返回。和重载运算符有关系吗?
【问题讨论】:
标签: c# string reference operators
我知道这是特殊情况,但是为什么字符串之间的 == 如果它们的值相等而不是当它们的引用相等时返回。和重载运算符有关系吗?
【问题讨论】:
标签: c# string reference operators
== 运算符在String 中被重载,实际上是执行值相等而不是引用相等。这个想法是为了让字符串对程序员更友好,并避免在使用引用相等来比较它们时出现错误(在 Java 中并不少见,尤其是对于初学者来说)。
老实说,到目前为止,我从来不需要通过引用来比较字符串。如果需要,可以使用object.ReferenceEquals()。
【讨论】:
if (name == "jim") 而不是 if (name.ValueEquals("jim"))。
==用于引用相等的特殊运算符/方法,而不是相反。通常我发现自己比较值比参考更频繁(除非我明确处理参考)。
因为字符串是不可变的,并且运行时可能选择将任何两个具有相同内容的字符串放在同一个引用中。所以引用比较字符串没有任何意义。
【讨论】:
operator == 执行值比较的问题。
是的。来自 .NET Reflector 这里是 String 类的等式运算符重载:
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
【讨论】:
在字符串上,== 比较 value
“虽然字符串是引用类型,但相等运算符(== 和 !=)被定义为比较字符串对象的值,而不是引用(7.9.7 字符串相等运算符)。这使得字符串相等的测试更加直观。”
简而言之,字符串上的 == 按值而不是按引用比较字符串,因为 C# 规范规定应该这样做。
【讨论】:
相等运算符(== 和 !=)被定义为比较字符串对象的值,而不是引用。
没有任何情况需要我比较参考文献,但如果你想这样做,那么你可以使用:
object.ReferenceEquals().
【讨论】: