【问题标题】:Why does StringBuilder.Equals return "true" in this case?为什么 StringBuilder.Equals 在这种情况下返回“true”?
【发布时间】:2014-09-12 16:11:46
【问题描述】:

我在比较 C# (XNA) 中的两个 StringBuilder 时遇到了一个小问题。

StringBuilder sb1;
StringBuilder sb2;

两者都在我的代码的不同部分进行了初始化。一个简单的 Console.WriteLine 显示它们包含相同的文本。但是,以下是错误的:

sb1.Equals(sb2); // This is false

以下是正确的

sb1.ToString().Equals(sb2.ToString); // This is true

这是怎么发生的?

【问题讨论】:

    标签: c# string equals stringbuilder equals-operator


    【解决方案1】:

    因为string 类覆盖Equals 方法,因此字符串 是通过值而不是引用来比较的。

    documentation

    虽然字符串是引用类型,但定义相等运算符(== 和 !=)是为了比较字符串对象的值,而不是引用。

    它谈到了==!= 运算符,但它们实际上是在调用string.Equals,它按值比较字符串。

    【讨论】:

    • 太好了,这就解释了。有没有办法使用 StringBuilders 直接比较它们的值?
    • @pad_ares 您不能覆盖 StringBuilder.Equals 但您始终可以实现自己的方法。然后用它代替 StringBuilder.Equals
    • 你真正想做的是什么?您是否试图确定两个 StringBuilder 实例是否包含相同的文本?如果是这样,那么您已经有办法做到这一点,即您自己发布的第二个代码 sn-p。您甚至可以编写一个扩展方法,以便在实例上调用它。请记住,StringBuilder 的意义在于构建String,因此比较内容超出了他们的专业领域。
    • StringBuilder 不会覆盖 Equals,但它确实提供了一个需要另一个 StringBuilder 的重载。超载比较内容。目前尚不清楚为什么在这种情况下不会调用该重载。
    【解决方案2】:

    StringBuilder 上有两个 Equals 重载,可能会做一些意想不到的事情。

    Equals(Object) 重载继承自 Object 并比较引用。

    Equals(StringBuilder) 重载比较 content、Capacity 和 MaxCapacity

    您似乎在调用这两个重载中的第二个。

    由于 StringBuilder 将动态扩展其容量,比较两个 StringBuilder 实例的结果取决于对每个实例执行的操作(例如追加、替换、删除等)的确切顺序。

    例如,这给出了您描述的结果:

    StringBuilder sb1 = new StringBuilder(), sb2 = new StringBuilder();
    sb1.Append("something").Append('1', 100).Replace("1", "");
    sb2.Append("something");
    Console.WriteLine(sb1.Equals(sb2)); // False
    Console.WriteLine(sb1.ToString().Equals(sb2.ToString())); // True
    

    似乎没有内置方法来仅比较内容,但如果您不想在比较时分配字符串,则可以轻松编写自己的比较:

    public static bool Equals(StrinBuilder left, StringBuilder right)
    {
        if (left.Length != right.Length)
            return false;
    
        int length = left.Length;
        for(int i = 0; i < length; i++)
            if (left[i] != right[i])
                return false;
    
        return true;
    }
    

    【讨论】:

    • 感谢您的精彩解释!对我来说,在“Equals”中使用容量和 maxCapacity 是非常出乎意料的,但它确实解释了为什么第二个重载没有按预期工作(仅限内容)。
    猜你喜欢
    • 2015-09-30
    • 2016-03-02
    • 2018-04-26
    • 2018-05-21
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多