In dem VB.NET-Code unten möchte ich drei Personen zu einer Liste von Personen hinzufügen. Ich dachte, ich könnte das gleiche Personenobjekt immer und immer wieder benutzen und einfach den Namen vor dem nächsten Add-Call ändern. Ich hatte gehofft, dass jeder Anruf das Objekt kopieren und diese Kopie zur Liste hinzufügen sollte ... Aber ich habe am Ende eine Liste von drei "Kim". Es scheint, dass sich die Listenelemente auf dasselbe Objekt beziehen.Kann ich erzwingen, dass ein Objekt in einem Aufruf in .NET als "ByVal" (als Kopie) übergeben wird?
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
Kann ich zwingen, dass aPerson
in jedem Add-Anruf kopiert wird? Oder muss ich separate Objekte für John, Emma und Kim erstellen?
'Oder muss ich separate Objekte für John, Emma und Kim erstellen müssen' Ja, Sie müssen –
sollten Sie verschiedene Objekte geben?. –
Alle Referenztypen, d. H. Klassen, verhalten sich so. Wenn "Person" eine Struktur wäre, hätte der angezeigte Code funktioniert, weil das Hinzufügen zur Liste eine Kopie erzeugen würde. Das mag den Anschein erwecken, dass die Verwendung von Strukturen über Klassen eine gute Idee ist, aber das ist es nicht. Klassen funktionieren aus einer Reihe von Gründen auf diese Weise und die Verwendung von Strukturen, in denen Klassen geeignet sind, kann eine Reihe von Problemen verursachen. Strukturen haben ihre Verwendung, aber das ist im Allgemeinen nur für kleine, unveränderliche Typen. Klassen sind und sollten die überwiegende Mehrheit der Zeit verwendet werden. Es mag seltsam erscheinen, aber Sie werden sich daran gewöhnen. – jmcilhinney