2 Stimmen

Anwendungsbereich der Methode List(Of T).Reverse von .NET

Ich habe eine einfache Funktion, die eine Liste Parameter nimmt. Während sie damit arbeitet, kopiert sie diese und kehrt die Kopie um, indem sie die .NET List(Of T).Reverse Methode.

Private Function FindThing(ByVal Things As List(Of Thing)) As Thing
    Dim ReverseOrderThings As List(Of Thing) = Things
    ReverseOrderThings.Reverse()
    For Each t As Thing In ReverseOrderThings
        ...
    Next
    Return Nothing
End Function

Mein Parameter ist definiert als ByVal . Aber es scheint, dass ByVal den Code in der Prozedur nicht daran hindert, die Reihenfolge der Liste zu ändern.

Dim Things As List(Of Thing) = GetSortedListFromSomewhere()
Dim FoundThing As Thing = FindThing(Things)
For Each t As Thing In Things
    ...
    'OMG! My Things are in reverse order!!1! WTF?'
Next

Wie kann ich meinen Listenparameter in einer solchen Funktion schützen?


Aktualisierung:

Dies ist der richtige Weg, um eine Kopie der Liste zu erstellen.

Dim ReverseOrderThings As List(Of Thing) = New List(Of Thing)(Things)

Jetzt wird die als Parameter übergebene Liste von der Methode Reverse() nicht mehr berührt.

6voto

RossFabricant Punkte 11872

Machen Sie eine Kopie der Liste.

Die Funktion kann den Wert der Liste nicht ändern, und das tut sie auch nicht. Sie ändert, was die Liste enthält, was erlaubt ist. Das einzig Unzulässige wäre die Zuweisung einer Variablen, die auf eine neue Liste verweist.

3voto

JaredPar Punkte 699699

Um die Liste zu schützen, müssen Sie vor dem Sortieren eine Kopie davon machen.

Things = New List(Of Thing)(Things)

3voto

Andrew Hare Punkte 332190

Auch wenn die Liste weitergegeben wird ByVal es ist die Referenz selbst, die übergeben wird ByVal Sie kopieren also den Speicherort der Liste, die, wenn sie verwendet wird, das gleiche Listenobjekt ist. Ich stimme mit rossfabricant überein, dass Sie selbst eine Kopie der Liste erstellen sollten.

1voto

Reed Copsey Punkte 536986

Sie können sie nicht direkt schützen.

Da List(Of Thing) ein Verweistyp (eine Klasse) ist, wird der Verweis ByVal übergeben, aber der Inhalt der Liste kann immer noch innerhalb Ihrer Routine geändert werden (nicht der Verweis auf List selbst, sondern der Inhalt der Liste).

Um die ursprüngliche Liste zu schützen, müssen Sie sie in eine neue Sammlung kopieren und diese sortieren. Wenn die Liste einen Referenztyp (Thing) enthält, ist dies relativ kostengünstig.

1voto

abatishchev Punkte 94886

Handelt es sich bei dem Argument jedoch um einen Referenztyp, kann die Prozedur den Inhalt oder die Mitglieder des zugrunde liegenden Objekts ändern.

de MSDN

Also ByVal schützt nur vor der Änderung von Werttypen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X