2

我不明白,为什么会出现以下equals结果true。这个例子来自msdn:

    Dim sb1 As New StringBuilder("abc")
    Dim sb2 As New StringBuilder("abc", 16)

    Console.WriteLine()
    Console.WriteLine("a1) sb1.Length = {0}, sb1.Capacity = {1}", sb1.Length, sb1.Capacity)
    Console.WriteLine("a2) sb2.Length = {0}, sb2.Capacity = {1}", sb2.Length, sb2.Capacity)
    Console.WriteLine("a3) sb1.ToString() = ""{0}"", sb2.ToString() = ""{1}""", _
                           sb1.ToString(), sb2.ToString())
    Console.WriteLine("a4) sb1 equals sb2: {0}", sb1.Equals(sb2))

当我检查 msdn 页面时,equals我发现:

引用相等意味着被比较的对象变量引用同一个对象。

所以例如

Dim sb1 as New StringBuilder("abc")
Dim sb2 as Stringbuilder = sb1
sb1.equals(sb2)

在这个例子中,我会理解结果true,但在第一个例子中,我有两个不同的对象和两个不同的引用。

谁能向我解释为什么第一个示例中的结果是true

4

1 回答 1

4

谁能向我解释为什么第一个示例中的结果是正确的?

因为StringBuilder重载Equals

返回值
类型:System.Boolean
如果此实例和 sb 具有相等的字符串Capacity、、和MaxCapacity值,则为真;否则为假。

如评论中所述:

  • 不是压倒一切Object.Equals(Object)的 - 如果您更改代码以使编译时类型and 不是sb1sb2或调用静态方法),它将返回ObjectStringBuilderObject.Equals(Object, Object)False
  • 您的代码依赖于StringBuilder16 的默认容量(对于短初始字符串);平等检查包括CapacityMaxCapacity
于 2013-11-14T09:41:19.547 回答