Equals比较两个不同的对象给出TRUE

时间:2013-11-14 09:39:27

标签: .net equals

我不明白,为什么以下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))

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

  

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

所以,例如。

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

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

有人可以向我解释为什么第一个例子中的结果是true

1 个答案:

答案 0 :(得分:4)

  

有人可以向我解释为什么第一个例子中的结果是真的吗?

因为StringBuilder overloads Equals

  

返回值
  类型:System.Boolean
  如果此实例和sb具有相等的字符串CapacityMaxCapacity值,则返回true;否则返回false。否则,错误。

如评论中所述:

  • 这是覆盖Object.Equals(Object) - 如果您更改代码,使sb1sb2的编译时类型为Object而不是StringBuilder(或调用静态Object.Equals(Object, Object)方法),它将返回False
  • 您的代码依赖于StringBuilder的默认容量为16(对于简短的初始字符串);平等检查包括CapacityMaxCapacity