我可以强制一个对象在.NET中的调用中作为“ByVal”(作为副本)传递吗?

时间:2017-05-18 09:21:54

标签: vb.net object pass-by-value

在下面的VB.NET代码中,我想将三个人添加到人员列表中。我以为我可以一遍又一遍地使用相同的person-object,只需在下一次Add-call之前更改它的名字。我希望每个调用都应该复制对象并将该副本添加到列表中......但最终我得到了一个三个“Kim”的列表。似乎列表元素引用了同一个对象。

Class Person
    Public Name As String
End Class

Sub Foo()
    Dim Persons as New List(Of Person)
    Dim aPerson As New Person

    aPerson.Name = "John"
    Persons.Add(aPerson)
    aPerson.Name = "Emma"
    Persons.Add(aPerson)
    aPerson.Name = "Kim"
    Persons.Add(aPerson)
End Sub

我可以强制在每次加入通话中复制aPerson吗?或者我是否需要为John,Emma和Kim创建单独的对象?

1 个答案:

答案 0 :(得分:1)

你所做的不是好习惯,因为你不应该以这种方式使用课程。

如果您的名字来自列表等来源,则可以使用For Each循环。

Dim MyNames As New List(Of String)
MyNames.Add("John")
MyNames.Add("Emma")
MyNames.Add("Kim")
For Each person_name As String In MyNames
    Dim aPerson As New Person
    aPerson.Name = person_name 
    Persons.Add(aPerson)
Next

如果数据来自文件,SQL请求或JSON,则此方法非常实用。

否则你只会:

Dim Persons as New List(Of Person)
Dim aPerson As New Person
Dim bPerson As New Person
Dim cPerson As New Person
aPerson.Name = "John"
Persons.Add(aPerson)
bPerson.Name = "Emma"
Persons.Add(bPerson)
cPerson.Name = "Kim"
Persons.Add(cPerson)