Wert wird nicht in List(Of T) geändert.

09/11/2008 - 11:42 von Karsten Sosna | Report spam
Hallo NG,
mal wieder so eine Merkwürdigkeit:
\\\
Dim vList As New List(Of Microsoft.DirectX.Vector3)

Dim v As New Microsoft.DirectX.Vector3(100, 100, 0)
vList.Add(v)
'Stimmt Ausgabe: ca. 141,4214
Console.WriteLine(vList(0).Length)

vList(0).Multiply(100 / vList(0).Length)

'Stimmt nicht Ausgabe: ca. 141,4214
Console.WriteLine(vList(0).Length)

Dim vn = vList(0)
vn.Multiply(100 / vn.Length)
vList(0) = vn
'Stimmt Ausgabe: ca. 100
Console.WriteLine(vList(0).Length)
///
Vector3.Multiply ist als einfache Public Sub(s As Single) implementiert.
Warum wird der Wert dann nicht geàndert wenn man direkt mit der List
arbeitet? Mache ich den Umweg wie im letzteren Teil des Codes funktioniert
es wie erwartet.

Danke für jeden Hinweis.
Gruß Scotty
 

Lesen sie die antworten

#1 Armin Zingler
09/11/2008 - 12:33 | Warnen spam
"Karsten Sosna" schrieb
Hallo NG,
mal wieder so eine Merkwürdigkeit:
\\\
Dim vList As New List(Of Microsoft.DirectX.Vector3)

Dim v As New Microsoft.DirectX.Vector3(100, 100, 0)
vList.Add(v)
'Stimmt Ausgabe: ca. 141,4214
Console.WriteLine(vList(0).Length)

vList(0).Multiply(100 / vList(0).Length)

'Stimmt nicht Ausgabe: ca. 141,4214
Console.WriteLine(vList(0).Length)

Dim vn = vList(0)
vn.Multiply(100 / vn.Length)
vList(0) = vn
'Stimmt Ausgabe: ca. 100
Console.WriteLine(vList(0).Length)
///
Vector3.Multiply ist als einfache Public Sub(s As Single)
implementiert. Warum wird der Wert dann nicht geàndert wenn man
direkt mit der List arbeitet?



Weil Vector3 ein Wertetyp ist. Beim ersten Fall wird der Rückgabewert, der
eine Kopie aus der Liste ist, multipliziert - und verwschwindet im
nirgendwo. In der Liste wird nichts geàndert.

Mache ich den Umweg wie im letzteren
Teil des Codes funktioniert es wie erwartet.



Weil du hier eine Zuweisung machst, d.h. die Liste wird geàndert.

Danke für jeden Hinweis.



Danke für die Frage. ;-)


Armin

Ähnliche fragen