List.Contains返回false,即使看起来它应该返回true

时间:2010-02-17 19:13:08

标签: vb.net list contains

Sub pageload() Handles Me.Load
    Dim bom As New List(Of Car)

    Dim car1 As New Car With {.Name = "Pea", .Year = 2}
    Dim car2 As New Car With {.Name = "Pea", .Year = 2}

    bom.Add(car1)

    MsgBox(bom.Contains(car2))
End Sub

WHY ???我的意思是对象具有完全相同的数据,为什么它说它没有被包含?

3 个答案:

答案 0 :(得分:15)

Contains方法通过调用对象上的Equals方法来测试相等性。除非您覆盖Equals类中的Car方法并实施自己的比较方式,否则Car的实例将通过引用标识视为相等(是完全相同的对象)不是基于它们的内容相等。

您创建的那些对象绝对不是同一个对象。证明:换一个不会改变另一个。

答案 1 :(得分:1)

关键是car引用类型,而不是值类型。您创建的两个汽车对象是完全不同的东西。每个都指向内存中的不同位置,即使它们碰巧具有所有相同的属性。把它们想象成同卵双胞胎。一个人进了一辆卡车。如果您询问其他人是否在卡车中,答案是否定的,即使从某种意义上说它们完全相同

如果您已定义car2然后将其设置为等于car1(Dim car2 As New Car = car1),那么您必须指向内存中完全相同的位置。你的结果是真的。两个变量都会引用相同的汽车对象。

现在,如果这是一个值类型,就像一个整数或日期(或结构。字符串的行为也是这样。),那么任何相同的值都会被认为是相同的。你把10美元放在一辆车上,我问10美元是否在车里。答案是肯定的,无论是10美元还是10美元都无关紧要。

您的示例是引用类型和值类型行为方式的主要区别的一个很好的示例。

对于默认情况下的引用类型, Equals 属性检查两个对象是否引用内存中完全相同的位置,而不是所有值是否相同。 (包含使用 Equals 属性。)如果您愿意,可以覆盖特定对象的行为。

答案 2 :(得分:0)

你的两辆车彼此完全独立。

Contains检查列表项是否指向与您提供的参数相同的对象。而不是这两个对象在逻辑上是否相等。

如果您希望它执行此操作,您应该覆盖Equals

Car - 方法