So lief ich in diesen Fehler, wo C# verhält wie ich in einer Liste durch Verweis und nicht nach Wert, wie es normalerweise passiert. Lassen Sie mich ein Beispiel zeigen:Wierd Weg C# übergibt in Listen als Argumente
using System;
using System.Collections.Generic;
namespace testprogram
{
class Program
{
static int x;
static List<Coordinate> coordinates;
static void Main(string[] args)
{
x = 10;
coordinates = new List<Coordinate>();
coordinates.Add(new Coordinate(0, 0));
coordinates.Add(new Coordinate(1, 1));
testfunction(x, coordinates);
Console.WriteLine(x);
foreach (var objekt in coordinates)
{
Console.WriteLine(objekt.xpos);
Console.WriteLine(objekt.ypos);
}
Console.Read();
}
static void testfunction(int test, List<Coordinate> objects)
{
test = 4;
foreach (Coordinate obj in objects)
{
obj.xpos = 4;
obj.ypos = 4;
}
}
}
class Coordinate
{
public int xpos;
public int ypos;
public Coordinate(int new_x, int new_y)
{
xpos = new_x;
ypos = new_y;
}
}
}
Dieser Code gibt:
10
4
4
4
4
Aber warum? Ich erwartete, es zu sein:
10
0
0
1
1
Ich habe versucht, eine zusätzliche Liste in der Funktion zu machen und den Wert des Parameters zuweisen, aber auch, dass nicht funktioniert. Gibt es eine Umgehungsmöglichkeit dafür?
Primitive Typen (int) werden nach Wert übergeben. Objekte (z. B. Liste) wird durch Verweis übergeben ... Siehe C# 101 Vorwort ... –
Roland
Liste ist inhärent ein Referenztyp, während Ihr Int nicht ist. Beide werden nach Wert übergeben, aber für eine Liste, deren Wert kopiert wurde, handelt es sich um einen (neuen) Zeiger, der auf die zugrunde liegende Liste SAME verweist. Also werden die List-Werte wirklich aktualisiert, während das Int nicht ist. – SlimsGhost
Ich denke, das ist eine gute Anfängerfrage. Ich glaube nicht, dass hier Minusabstimmungen angebracht sind. Ich stimme die Frage +1. –