2017-05-18 1 views
0

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?

+1

'Oder muss ich separate Objekte für John, Emma und Kim erstellen müssen' Ja, Sie müssen –

+1

sollten Sie verschiedene Objekte geben?. –

+0

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

Antwort

1

Was Sie tun, ist keine gute Übung, da Sie keine Klasse auf diese Weise verwenden sollten.

Wenn Ihre Namen aus einer Quelle wie einer Liste stammen, können Sie eine For Each Schleife verwenden.

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 

Dieser Ansatz könnte sehr praktisch sein, wenn die Daten beispielsweise aus einer Datei, SQL-Anfrage oder JSON stammen.

Sonst würden Sie gerade haben:

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) 
+0

'For' sollte' For Each' sein. Würde eine Bearbeitung einreichen, aber seine Unterschriftsgrenze und der Rest der Antwort ist großartig. –

+0

@AFriend Haha danke Ich habe total vergessen, es hinzuzufügen und habe es beim Posten nicht bemerkt – Mederic

Verwandte Themen