【问题标题】:Why strings does not compare references?为什么字符串不比较引用?
【发布时间】:2011-07-09 09:56:24
【问题描述】:

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

【问题讨论】:

    标签: c# string reference operators


    【解决方案1】:

    == 运算符在String 中被重载,实际上是执行值相等而不是引用相等。这个想法是为了让字符串对程序员更友好,并避免在使用引用相等来比较它们时出现错误(在 Java 中并不少见,尤其是对于初学者来说)。

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

    【讨论】:

    • +1 没错。 “对程序员更友好。”我们没有在 C# 中使用指针。例如,我们希望能够编写 if (name == "jim") 而不是 if (name.ValueEquals("jim"))
    • @Jim:老实说,我很惊讶这还没有作为一种通用语言特性流行起来:你会总是在需要时与 ==用于引用相等的特殊运算符/方法,而不是相反。通常我发现自己比较值比参考更频繁(除非我明确处理参考)。
    【解决方案2】:

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

    【讨论】:

    • 不,这是错误的。您可能正在考虑 Java 而不是 C#。虽然您描述的机制(字符串实习)确实存在于 .NET 中,但它与问题并不真正相关。字符串的不变性并没有先验地回答为什么operator == 执行值比较的问题。
    • @Konrad Rudolph:我仍然认为在这种情况下参考比较没有意义。虽然这可能不是选择这种设计的唯一原因,但当您期望两个字符串引用不同时,它肯定会让您失望,因为您分别初始化了它们,但它们是相同的,因为发生了实习。
    • 嗯,例如运行时的事情是错误的。运行时将对字符串文字执行此操作。曾经。但更重要的是,您的“所以”实际上是不合逻辑的。你的答案的第一部分和你暗示的第二部分之间的因果关系根本不存在。此外,有责任使用官方参考来证明这一说法,而不是我来反驳它。
    • @Konrad Rudolph:同时编辑 cmets 会导致尴尬的“对话”:-)
    • 对不起。再次重读您的答案后,我更改了评论以使其更准确。我同意 cmets 无论如何都不是讨论的最佳场所。 ;-)
    【解决方案3】:

    是的。来自 .NET Reflector 这里是 String 类的等式运算符重载:

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

    【讨论】:

      【解决方案4】:

      在字符串上,== 比较 value

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

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

      【讨论】:

      【解决方案5】:

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

      没有任何情况需要我比较参考文献,但如果你想这样做,那么你可以使用:

      object.ReferenceEquals().
      

      【讨论】:

        猜你喜欢
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-03-30
        相关资源
        最近更新 更多