Referenz auf eine List, aber wie?



  • 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? 🙂



  • und genau das verwirrt mich
    auch wenn man zwei mal new schreibt - dann muesste das ergebnis doch da selbe sein - das zweite new war dann doch einfach nur ueberfluessig aber zerstoert nichts

    ListClass list = createNewList();
    ListClass listRef = list;
    
    ListClass list = createNewList();
    ListClass listRef = createNewList();
    listRef = list;
    

    beides ist doch identisch



  • Ist ja auch so. Das Problem hier ist nur, dass nach der letzten Zeile

    listRef = list;
    

    bei mir noch das hier kommt:

    listRef = createNewList();
    

    Mit dem ich eigentlich erreichen will, dass listRef = createNewList = list ist, was aber natürlich nicht der Fall ist, da listRef sich dann auf einen neuen, von createNewList angelegten Speicher bezieht.

    PS: Bitte jetzt nicht meinen Post auf der vorherigen Seite übersehen 😉



  • Mr Evil schrieb:

    und genau das verwirrt mich
    auch wenn man zwei mal new schreibt - dann muesste das ergebnis doch da selbe sein - das zweite new war dann doch einfach nur ueberfluessig aber zerstoert nichts

    ListClass list = createNewList();
    ListClass listRef = list;
    
    ListClass list = createNewList();
    ListClass listRef = createNewList();
    listRef = list;
    

    beides ist doch identisch

    Ja, korrekt. Aber kommt eben dann drauf an, welches Objekt man jetzt beobachtet.
    Simon



  • @veryxRV
    ist das nicht ein falsches design ?
    ich wuerde erwarten das CreateNewList das macht was es sagt - es erstellt eine _neue_ liste
    wenn ich CreateNewList aufrufen wuerde , und ich bekaehme eine referenz auf eine bereits vorhandene - wuerd ich mich wundern
    und wenn du den code nach einer weile liest und sich eine andere liste unerwartet aendert - dann debugge das mal

    wie waers mit

    List<object> GetOrCreateList(List<object> oldList)
    {
        return (oldList == null) ? CreateNewList() : oldList;
    }
    
    List<object> list = CreateNewList();
    List<object> listRef = GetOrCreateList(list);
    


  • Um genau zu sein, sieht das ganze so aus:

    listRef = createNewList(listRef) //Ordnet listRef neu anhand der Reihenfolge einer Liste in der GUI und gibt sie dann zurück.
    

    Zuvor gibt es zwei Modelle (Listen) list1 und list2. Auf welche der beiden sich listRef beziehen soll, entscheidet der Code dynamisch. Deswegen beharre ich auch immer darauf, dass alle Änderungen über listRef vorgenommen werden, da ich nicht weiß, auf welche der beiden Listen list1 und list2 sich listRef während der Laufzeit beziehen wird.



  • auch dann wuerd ich sagen => design fehler

    CreateNewList sortiert nur die parameter list ?
    eine sortierte liste ist doch keine neue liste

    dann ist entweder
    List.Sort zu verwenden oder
    SortList(List) zu erstellen

    am sonsten - irgendwo
    listRef = toUseList;
    zu schreiben duerfte doch eigentlich kein problem sein


Anmelden zum Antworten