Übergeben von Listen, Stacks, etc.

lara86

Mitglied
Hallo,

ich bin gerade etwas verwirrt.
Wenn ich versuche eine List<T> oder einen Stack<T> an eine andere Methode zu übergeben, dann macht er das zwar, aber IMMER als Referenz. Sprich ändere ich die Liste oder den Stack innerhalb der aufgerufenen Methode, dann ändert er sich auch in der aufrufenden Methode...

Ist das normal ? Ich dachte immer ich muss beim Übergeben als eine Methode das Schlüsselwort "ref" angeben damit er es als Referenz angibt, das tue ich aber gar nicht....

Wo ist der (Denk-)Fehler ?

Grüße
 
Hi,

hier eine kurze, knackige Erklärung.. ;)

Da sowohl die List als auch der Stack ein Referenztyp sind, werden die Referenzen als Wert übertragen.. relativ verwirrend. ;)

Best regards
 
Hey,

danke für die Antwort.
Das führt mich direkt zum nächsten Problem, weil nun muss ich den Stack in der aufgerufenen Methode ja kopieren, damit ich mit einer Kopie arbeiten kann.
Versucht hab ichs so:

C#:
public void doSomething(Stack<Node> _myStack)
{
    Stack<Node> copyStack = new Stack<Node>(_myStack);
}

Der neue Stack steht aber auf dem Kopf. Hab auch herausbekommen das es an dem IEnumerable liegt, weil der Konstruktor von Stack keinen Stack erwartet sondern ein IEnumerable.
Nur wie kopiere ich denn nun einen Stack ? Clone() geht nicht da ich auf .NET 3.5 angewiesen bin...

Grüßle
 
Hi,

das liegt wohl daran, dass du einen Stack kopieren willst ;) Bei einem Stack kannst du nur das oberste Element lesen. Der IEnumarator wird das genauso tun, bis der Stack leer ist und die Elemente in den neuen Stack in dieser (verkehrten) Reihenfolge kopieren. Die simpelste Lösung, die mir an dieser Stelle einfällt wäre, den Vorgang ein zweites mal zu wiederholen.

Allerdings kennt vlt. jemand, der sich besser mit .NET auskennt, eine bessere Vorgehensweise. ;)

Best regards
 
Hey,

hab festgestellt es gibt eine Reverse<> Methode, denke damit kann ichs wieder umbiegen. Hab nur noch nicht rausbekommen wie sie funktioniert, aber so viele Möglichkeiten kanns ja nicht geben. Obs schön ist sei jetzt mal dahingestellt :)

Grüßle
 
Was willst du denn Klonen? Die Objekte im Stack oder nur den Stack, aber mit Verweis auf die selben Instanzen?
 
Hallo,

ich übergebe einen Stack an eine andere Methode, diese macht mit dem Stack etwas. Dadurch das ein Stack aber als Referenz übergeben wird, ändert er sich auch in der aufrufenden Methode. Das will ich aber nicht, also muss ich ihn kopieren, dazu müsste es dann aber eine richtige Kopie sein.

Im Moment mach ichs jetzt so....weil ichs anders einfach nicht hinbekommen:

C#:
public bool checkForEql(Stack<Node> _myStack)
{
    Stack<Node> copyStack = new Stack<Node>();
    Node[] tmpArr = _myStack.ToArray();
    for(int i = tmpArr.Length - 1; i >= 0; i--)
    {
        copyStack.Push(tmpArr[i]);
    }
    //Do Something
}

Geht zwar, aber gefallen tuts mir nicht...
 

Neue Beiträge

Zurück