Referenz auf eine List, aber wie?
-
Hallo zusammen,
ich möchte folgendes realisieren:
List<SomeClass> list = new List()<SomeClass>; List<SomeClass> listRef = new List()<SomeClass>; listRef = list;
Wobei listRef nur eine Referenz auf list sein soll, sprich: Wenn ich etwas an listRef ändere, zB. per listRef.Add(Object), dann sollen diese Änderungen an list vorgenommen werden. Im Grunde also nichts anderes als ein Pointer in C++.
Nur auf die oben beschriebene Art und Weise scheint es nicht zu funktionieren, da so alle Änderungen an listRef auch nur an listRef und nicht an list vorgenommen werden.
Hat es vielleicht etwas mit dem "new" bei der Zuweisung zutun?
Vielen Dank schon mal im Voraus!
Grüße
veryxrv
-
Da List<T> bereits ein Referenz Typ ist, hast Du genau schon was Du benötigst. Natürlich musst Du die Liste nur einmal erzeugen (new).
List<SomeClass> list = new List<SomeClass>(); List<SomeClass> listRef = list; list.Add(new SomeClass()); SomeClass sc = listRef[0];
Simon
-
Danke für die Antwort.
Ich möchte aber, dass listRef.Add(SomeObject) sich auf list auswirkt, dass SomeObject also zu list hinzugefügt wird. Wie stelle ich das an?
-
veryxRV schrieb:
Danke für die Antwort.
Ich möchte aber, dass listRef.Add(SomeObject) sich auf list auswirkt, dass SomeObject also zu list hinzugefügt wird. Wie stelle ich das an?
Das ist auch so, wie du an meinem Test code sehen kannst.
-
Nein,leider nicht. In deinem Testcode wird list ein Objekt hinzugefügt, was sich ebenfalls auf listRef auswirkt. Ich möchte aber, dass sich Objekte die listRef hinzugefügt werden, auch in list wiederfinden.
Dann sähe dein Code so aus:
List<SomeClass> list = new List<SomeClass>(); List<SomeClass> listRef = list; listRef.Add(new SomeClass()); SomeClass sc = list[0];
Das funktioniert aber leider nicht, habe es ausprobiert
Verstehst du, wie ich das meine?
PS: Vielleicht ist es noch hilfreich zu wissen, dass "list" und "listRef" bei mir von "List<>" abgeleitete Klasse sind.
-
Nein,leider nicht. In deinem Testcode wird list ein Objekt hinzugefügt, was sich ebenfalls auf listRef auswirkt. Ich möchte aber, dass sich Objekte die listRef hinzugefügt werden, auch in list wiederfinden.
Dann sähe dein Code so aus:
List<SomeClass> list = new List<SomeClass>(); List<SomeClass> listRef = list; listRef.Add(new SomeClass()); SomeClass sc = list[0];
Das funktioniert aber leider nicht, habe es ausprobiert
Das funktioniert aber garantiert.
PS: Vielleicht ist es noch hilfreich zu wissen, dass "list" und "listRef" bei mir von "List<>" abgeleitete Klasse sind.
Aha... ja, dann poste doch den Code mal. Wie soll den der Leser deiner Frage wissen, dass der Code den Du postest nicht derjenige ist der nicht funktioniert?
Also zeig ein Mini Bsp.
-
http://openbook.galileocomputing.de/visual_csharp/visual_csharp_03_003.htm#mjf9e082c017f8163ab06e252856f2172e
Schau mal hier, also eigentlich ist das mit der Referenz wie es theta gezeigt hat genau richtig, du wirst wohl irgendwo einen implementierungsfehler deiner klasse haben.
-
was mir dazu einfaellt
muesste das ursprungliche nicht auch gehen ? also
List<SomeClass> list = new List()<SomeClass>; List<SomeClass> listRef = new List()<SomeClass>; listRef = list;
ich mein - es wird am anfang zwar ne neue liste erstellt - nur die wird dann doch mit einer neuen referenz umgebogen
muesste also letzt endlich das selbe ergebnis liefern wieList<SomeClass> list = new List()<SomeClass>; List<SomeClass> listRef = list;
oder nicht ?
-
Ja.Es ist äquvivalent. Nur stimmt einfach etwas was in der Implementation von der List von dem Threadsteller nicht und das hat er uns anfangs vorenthalten.
-
@Mr. Evil: Ja. Habe ich ja geschrieben. Ausserdem ist die Syntax (new List()<SomeClass>;) falsch.
-
Alles klar, sorry, dass ich das mit der Klasse vergessen habe zu erwähnen. Hier ein Beispiel:
public class ListClass : List<SomeClass> {} [...] ListClass list = new ListClass(); ListClass listRef = list; listRef.add(SomeClass) // fügt in meinem Code "SomeClass" nicht auch zu "list" hinzu, sondern nur zu listRef
So sieht mein eigentlicher Code vereinfacht aus. Die Klasse hat auch keinen Constructor. Muss sie den vererbt bekommen?
Danke schon mal!
PS: Das mit der Syntax hab ich mir fast gedacht. Da VS alles selbst macht, prägt man sich nichts mehr ein
-
ich hab nur copy paste gemacht - sollte wo voher lesen was ich paste #gg
-
Mr Evil schrieb:
ich hab nur copy paste gemacht - sollte wo voher lesen was ich paste #gg
Kannst du dir bitte meinen obigen Code kurz anschauen? Danke!
-
warum ? ich hab nur theta geantwortet #gg
-
Hmm mir will grad nicht bewusst werden was es bringt die Standardlist,spezialisiert, als Basisklasse für eine andere Klasse zu nutzen.
Wenn du eine eigene List implementieren willst, solltest du das IList,IList<T>,IEnumerable,IEnumerable<T> und glaub noch eins, eventuell ICollection implementieren, alles andere ist nicht gerade sinnvoll.
Was spricht denn dagegen die normale List<T> zu nutzen und da deine Elemente reinzupacken, dann erzielst du auch das erwünschte Verhalten.
-
veryxRV schrieb:
Alles klar, sorry, dass ich das mit der Klasse vergessen habe zu erwähnen.
Spielt im Nachhinein auch keine Rolle mehr. Vorher weiss man das einfach nicht, welche Details wichtig sind...
veryxRV schrieb:
Hier ein Beispiel:
public class ListClass : List<SomeClass> {} [...] ListClass list = new ListClass(); ListClass listRef = list; listRef.add(SomeClass) // fügt in meinem Code "SomeClass" nicht auch zu "list" hinzu, sondern nur zu listRef
Das funktioniert einwandfrei. 1 Objekt, zwei Ref.
veryxRV schrieb:
So sieht mein eigentlicher Code vereinfacht aus. Die Klasse hat auch keinen Constructor. Muss sie den vererbt bekommen?
Die Konstruktoren werden nicht mit vererbt.
So.. wie kommst Du also zum Schluss, dass es nicht funktioniert? Wie stellst Du das fest?
Simon
-
Mr Evil schrieb:
warum ? ich hab nur theta geantwortet #gg
Das schließt ja nicht aus, dass du vielleicht auch zum Wesentlichen etwas beiträgst, oder?
theta schrieb:
So.. wie kommst Du also zum Schluss, dass es nicht funktioniert? Wie stellst Du das fest?
Habe jetzt mal unabhängig von meinem eigentlichen Code einen ganz kurzen Testcode geschrieben:
ListClass list = new ListClass(); ListClass listRef = list; Console.WriteLine("list.Count => " + list.Count); Console.WriteLine("listRef.Count => " + listRef.Count); listRef.Add(""); Console.WriteLine("list.Count Now => " + list.Count); Console.WriteLine("listRef.Count Now => " + listRef.Count);
Und siehe da: Es funktioniert!
list.Count => 0 listRef.Count => 0 list.Count Now => 1 listRef.Count Now => 1
Die Frage ist jetzt nur, was ich bei meinem original Code falsch mache... Ich such mal nach dem Unterschied.
-
Ich glaube, ich weiß, warum es in meinem spziellen Fall nicht geht:
ListClass list = new ListClass(); ListClass listRef = list; //jetzt aber: listRef = createNewList(); //jetzt listRef != list, da neue Zuweisung, richtig?
Ich möchte aber die Ausgabe von "createNewList()" über listRef in list schreiben. Wie mache ich das dann?
Ich hoffe, das ist so verständlich...
-
Genau. Und das ist auch derselbe Fehler wie im ersten Codestück (zweimal new).
Vielleicht hilft Dir das:
ListClass list = = createNewList(); ListClass listRef = list; // Jetzt zeigt list und listRef auf dasselbe Objekt.
Simon
-
Nein, leider nicht, weil die Zuweisung schon über listRef erfolgen muss. Habe es jedoch jetzt so probiert:
ListClass list = new ListClass(); ListClass listRef = list; ListClass listBuf = createNewList(); listRef.Clear(); listRef.AddRange(listBuf.AsEnumerable());
Allerdings habe ich jetzt das Problem, dass die "set"-Methode der List dabei nicht aufgerufen wird, welche eigentlich dafür sorgen soll, die Änderungen an der Liste in ein File auf der Festplatte zu schreiben.
Deswegen: Hat jemand eine bessere Idee?