3
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

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

4

3 回答 3

15

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

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

于 2010-02-17T19:15:07.807 回答
1

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

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

现在,如果这是一个值类型,如整数或日期(或结构。字符串也以这种方式运行。),那么任何相同的值都将被视为相同。你把 10 美元放在车里,我问车里有没有 10 美元。答案是肯定的,不管是我的 10 美元还是你的 10 美元。

您的示例是引用类型和值类型行为方式的关键差异的一个很好的示例。

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

于 2010-02-17T19:17:02.593 回答
0

你的两辆车是完全独立的。

Contains checks whether any list item points to the same object like the parameter you provide. And not whether these two objects are logically equal.

If you want it to do this, you should override the Equals-method of your Car

于 2010-02-17T19:18:07.547 回答