.net - 比较两个不同的对象时等于给出 TRUE

标签 .net 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 时,我发现:

Reference equality means that the object variables that are compared refer to the same object.

例如

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

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

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

最佳答案

Could anyone explain to me why the result in the first example is true?

因为StringBuilder overloads Equals :

Return Value
Type: System.Boolean
true if this instance and sb have equal string, Capacity, and MaxCapacity values; otherwise, false.

正如评论中所述:

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

关于.net - 比较两个不同的对象时等于给出 TRUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974153/

相关文章:

java - 如果我在 Java 中覆盖 'equals' 方法,为什么需要覆盖 hashcode?

c# - EntitySet - IList.Add 没有设置分配是否有合理的理由?

.net - Stopwatch.GetTimestamp() 替代方案在多个处理器上是安全的

c# - 位数组相等

java - 重写 equals 方法会出错

c# - Equals 和 GetHashCode 方法不一致

c# - 使用 Parallel for each 获取堆栈溢出异常,这是由于线程安全吗?

c# - 使用错误行号在 XSD 上验证 XML

c# - 在不触发验证客户端的情况下检查验证组是否有效

java - Java 中的 HashCode 和等于