C# List<Struct> Übergabe ändert Objekte

DrMueller

Erfahrenes Mitglied
Hallo Leute,

ich mache wahrscheinlich einen Denkfehler: Ich habe eine Liste von Rectangles, also Structs. Soweit ich weiss werden diese ja per Val übergeben:

Code:
            int xDiff = 0;
            int yDiff = 0;

            List<Rectangle> tmpSquares = squares;

            switch (direction)
            {
                case Direction.Up:
                    ChangeOrientation();
                    return;
                case Direction.Right:
                    xDiff = Game.BLOCK_SIZE;
                    yDiff = 0;
                    break;
                case Direction.Down:
                    xDiff = 0;
                    yDiff = Game.BLOCK_SIZE;
                    break;
                case Direction.Left:
                    xDiff = -Game.BLOCK_SIZE;
                    yDiff = 0;
                    break;
            }

            for (int cnt = 0; cnt < squares.Count; cnt++)
            {
                squares[cnt] = new Rectangle(squares[cnt].X + xDiff, squares[cnt].Y + yDiff, squares[cnt].Width, squares[cnt].Height);
            }

Wenn ich dann in der For-Schliefe die Squares[cnt] ändere, ändert sich tmpSquares trotzdem mit. Ich war der Meinung, dass eben Structs als Kopie übergeben werden, und nicht als Pointer.

Ich nehme an, ich mache einen Denkfehler, allerdings kann ich mir hier nicht erklären, welchen.


Hat da wer eine Idee, was dafür verantwortlich ist?



Vielen Dank im Voraus.

Müller matthias
 

Turri

Erfahrenes Mitglied
Hallo,

der Rectangle ist ein Struct, stimmt schon... aber das Problem liegt an deinen Listen.
tmpSquares und squares beinhalten die selben Verweise auf die Rects, da du die eine Liste der anderen Zuweist.

Wenn du also ein Rect veränderst, siehst du natürlich die Änderung auch in der anderen Liste.

Edit: Das soll heissen, es werden keine Kopien von deinen Rects erzeugt, wenn du die eine Liste der anderen zuweist.
 
Zuletzt bearbeitet:

DrMueller

Erfahrenes Mitglied
Sorry, ich seh die Lösung schon, aber wegen dem Lerneffekt frag ich nochmal:
Ich dachte Structs müssen speziell gecastet werden, damit sie überhaupt auf dem Heap, und nicht auf dem Stack gespeichert sind und das es so gar nicht möglich ist, Verweise auf diese zu speichern, da sie wie Werte-Veriablen gespeichert werden.

Hab ich hier grad einen Knopf gemacht irgendwo?
 

Turri

Erfahrenes Mitglied
Soweit ich weiß stehen in der Liste Verweise drin, die einmal auf den Stack und einmal auf den Heap zeigen können. Kommt auf den Typ in der Liste an.
Sonst wäre die Liste vom Speicher selbst ja riesen groß wenn die structs direkt drin stehen.
Bin mir da aber auch nicht ganz sicher wie es intern funktioniert.
 

Neue Beiträge