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

C# 为什么字符串不比较引用?,c#,string,reference,operators,C#,String,Reference,Operators,我知道这是一种特殊情况,但为什么==在字符串的值等于时返回,而在引用等于时返回。它与重载运算符有关吗?在字符串上,==比较 虽然字符串是引用类型,但定义相等运算符(=和!=)是为了比较字符串对象的值,而不是引用(7.9.7字符串相等运算符)。这使字符串相等性测试更直观 简言之,字符串上的==通过值而不是引用来比较字符串,因为C#规范说它应该这样做。实际上,==操作符在String中重载,以执行值相等而不是引用相等。这样做的目的是使字符串对程序员更加友好,并避免在使用引用相等来比较字符串时出现错误

我知道这是一种特殊情况,但为什么==在字符串的值等于时返回,而在引用等于时返回。它与重载运算符有关吗?

在字符串上,==比较

虽然字符串是引用类型,但定义相等运算符(=和!=)是为了比较字符串对象的值,而不是引用(7.9.7字符串相等运算符)。这使字符串相等性测试更直观


简言之,字符串上的==通过值而不是引用来比较字符串,因为C#规范说它应该这样做。

实际上,
==
操作符在
String
中重载,以执行值相等而不是引用相等。这样做的目的是使字符串对程序员更加友好,并避免在使用引用相等来比较字符串时出现错误(在Java中并不少见,尤其是对于初学者)


老实说,到目前为止,我从未需要通过引用来比较字符串。如果需要,可以使用。

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

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

public static bool operator ==(string a, string b)
{
    return Equals(a, b);
}
相等运算符(
=
!=
)被定义为比较字符串对象的值,而不是引用

在任何情况下,我都不需要比较参考文献,但如果您想这样做,您可以使用:

object.ReferenceEquals().

不,这是错误的。您可能想到的是Java而不是C。虽然您所描述的机制(字符串实习)确实存在于.NET中,但它实际上与这个问题无关。字符串的不变性并不能先验地回答为什么
操作符==
执行值比较的问题。@Konrad Rudolph:我仍然认为在这种情况下,引用比较是没有意义的。虽然这可能不是设计被如此选择的唯一原因,但如果你期望两个字符串引用不同,因为你分别初始化了它们,但它们是相同的,因为发生了内部调用,那么这肯定会让你大吃一惊。例如,运行时的事情是错误的。运行时将仅对字符串文本执行此操作。曾经但更重要的是,你的“so”实际上是一个非序列。答案的第一部分和你暗示的第二部分之间根本不存在因果关系。此外,你有责任使用官方参考资料来证明这一说法,而不是我来反驳它。@Konrad Rudolph:编辑评论同时会导致尴尬的“对话”:-)对不起。在再次阅读你的答案后,我改变了我的评论,使之更加准确。我同意,无论如何,评论不是讨论的最佳场所。;-)+1完全正确。“对程序员更友好。”我们没有在C#中使用指针。例如,我们希望能够编写
if(name==“jim”)
,而不是
if(name.ValueEquals(“jim”)
@jim:老实说,我感到惊讶的是,这还没有成为一种通用的语言特性:您总是需要一个特殊的操作符/方法来实现引用相等,而不是相反的方式,而与
=
保持值相等。通常我发现自己比较值的频率比比较引用的频率要高(除非我明确地处理引用)。