将类对象添加到3个不同的列表中,但值没有改变?

The*_*bie 1 vb.net

我有一个奇怪的问题,也许这是一个简单的解决方法,但我无法弄清楚。我创建了一个类,然后为该类创建了一个对象。我更改了内部变量的值,并将其添加到其他列表中,但不同列表中的值都相同。我的解释很难理解,因此希望该代码使它更易于理解。

Public Class Person
    Public Property Name As String
    Public Property Gender As String
End Class

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim Human As New Person
    Human.Name = "Amanda"
    Human.Gender = "Female"

    Dim List1 As New List(Of Person)
    Dim List2 As New List(Of Person)
    Dim List3 As New List(Of Person)

    'Add to list 1
    Human.Name = "Ashley"
    List1.Add(Human)

    'Add to list 2
    Human.Name = "Amy"
    List2.Add(Human)

    'Add to list 3
    Human.Name = "Ana"
    List3.Add(Human)

    MsgBox("List1 Person Name: " & List1(0).Name & vbNewLine &
           "List2 Person Name: " & List2(0).Name & vbNewLine &
           "List3 Person Name: " & List3(0).Name)
End Sub
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

在此处输入图片说明

难道每个人都没有像我设置的名字一样的名字吗?

他们都是同一个名字。我在将名称添加到列表之前更改了名称,当我获取值时,它们也来自其他列表。我不明白为什么结果会全都一样。

Joe*_*orn 5

目前只有一个人的对象实例中的代码。将其添加到列表中既不会创建新对象,也不会创建副本。在所有三个列表中,您仍然具有相同的对象实例,因此,在MsgBox()调用时,该Name实例的属性已更改为Ana

您想这样做:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim List1 As New List(Of Person)
    Dim List2 As New List(Of Person)
    Dim List3 As New List(Of Person)

    List1.Add(New Human With {.Name = "Ashley", .Gender = "Female"})
    List2.Add(New Human With {.Name = "Amy", .Gender = "Female"})
    List3.Add(New Human With {.Name = "Ana", .Gender = "Female"})

    MsgBox($"List1 Person Name: {List1(0).Name}{vbCrLf}List2 Person Name: {List2(0).Name}{vbCrLf}List3 Person Name: {List3(0).Name}")
End Sub
Run Code Online (Sandbox Code Playgroud)

您还可以使用集合初始化程序来进一步简化代码,但这可能会进一步混淆引用,变量和实例之间的区别,并且对于一项而言,它并不比.Add()调用好多少。但是,让我们展示一下这样的乐趣,并在使用时更好地利用该List类型:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim people As New List(Of Person) From {
        New Human With {.Name = "Ashley", .Gender = "Female"},
        New Human With {.Name = "Amy", .Gender = "Female"},
        New Human With {.Name = "Ana", .Gender = "Female"}
    }

    MsgBox($"First Person Name: {people(0).Name}{vbCrLf}Second Person Name: {people(1).Name}{vbCrLf}Third Person Name: {people(2).Name}")
End Sub
Run Code Online (Sandbox Code Playgroud)

作为附带说明,Structure而不是类将产生您在问题中预期的行为。但是,许多人认为像这样的易变结构是不好的做法。坚持上课。