3

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

StringBuilder sb1;
StringBuilder sb2;

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

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

但以下是正确的

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

这怎么会发生?

4

2 回答 2

7

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

请参阅文档

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

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

于 2014-07-22T00:57:45.127 回答
3

有两个重载Equalson StringBuilderwhich 可以做一些意想不到的事情。

重载继承自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;
}
于 2014-07-22T04:03:20.083 回答