Laden...

Ungewollter Datenzugriff in Dictionary

Erstellt von Fenriir |F13| vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.402 Views
F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren
Hinweis von herbivore vor 9 Jahren

vorneweg: ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Ungewollter Datenzugriff in Dictionary

moin leute,

mein problem ist (wahrscheinlich) weniger syntaktischer und mehr struktureller natur. seit ein paar monaten arbeite ich an einem kleinen forschungsprojekt im zuge dessen ich mich mit c#-programmierung auseinandersetzen muss.

bei meinem programm speichere ich eine treenode-kombination sowie einen zugehörigen daten satz in einem dictionary <string; arraylist>. in besagter arraylist sind also mehrere werte verschiedenen typs enthalten, wie auch ein weiteres dict <string, arraylist> in dem jedem treenode(bzw. treenode.name) informationen zugeordent sind. soweit, so praktikabel.

ziel des ganzen ist, ein bestehendes set von informationen zu laden, die treenodes bzw. die ihnen zugeordneten variablen zu bearbeiten und das ganze unter einem neuen namen zu im erstgenannten dict zu "speichern". mein problem ist, dass beim editieren des "geladenen" informations-sets SOFORT die daten des geladenen sets geändert werden und ich beim speichern als bspw. "option1" 2 kvp mit identischen values (a.k.a. arraylists) habe.

ich bin für jede idee, wo ein fehler liegen könnte dankbar

ahoi

5.657 Beiträge seit 2006
vor 9 Jahren

Hi Fenriir |F13|,

du solltest vor allem ein vernünftiges Klassendesign erstellen, das zu deinen Anforderungen paßt. Eine Arraylist ist kein Typ, in dem man einfach verschiedene Daten unterschiedlicher Typen reinspeichert. Dort gehört eine richtige Klasse hin, mit den jeweiligen Daten als Eigenschaften vom richtigen Typ. Und wenn das Bearbeiten der Daten eine Kopie des Datensatzes anlegen soll, dann mußt du das eben in deiner Businesslogik so implementieren. Von allein wird das jedenfalls nicht so funktionieren.

Das sind allerdings mehr oder weniger Grundlagen, daher möchte ich dich bitten, [Hinweis] Wie poste ich richtig? zu beachten.

Christian

Weeks of programming can save you hours of planning

F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren

moin mr. sparkle,

danke für die schnelle antwort. ich habe mein programm umstrukturiert und die Klasse "Schema" entwickelt. mein problem ist immer noch vorhanden. wenn ich ein gespeichertes objekt dieser klasse lade, bearbeite und unter neuem namen speichere, werden beide objekte mit den neuen informationen gespeichert. ist mir schleierhaft wieso...

1.696 Beiträge seit 2006
vor 9 Jahren

wenn du z.B.


var a = new classBla();
classBla b = a;

machst, dann sollst du dich nicht wundern, wenn beide Objekte sich ändern wenn du nur ein davon änderst. Ist das so?

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren

so is das. muss ich da mit der clone-methode arbeiten? und wieso geht das auf diese weise nich?

16.807 Beiträge seit 2008
vor 9 Jahren

Wenn man Clonen MUSS, dann stimmt in den meisten Fällen der gesamte Code strukturell schon nicht.

F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren

welche alternative gibts denn noch?

64 Beiträge seit 2012
vor 9 Jahren

und wieso geht das auf diese weise nich?

Das wird dir hier erklärt: C# Parameter passing (what is a reference type)

*edit ref war eine ungünstige Abkürzung für reference...

++Rekursion ++
(lat. , die) siehe Rekursion

F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren

guck ich mir an, danke schonmal!

1.696 Beiträge seit 2006
vor 9 Jahren

und wieso geht das auf diese weise nich?

denn damit übergibst du nur die Referenz auf das Objekt an einer 2. Variable, beide Variablen zeigen somit auf das gleiche Objekt, ob du nun über die eine oder die andere Variable was machst, du veränderst das selbe Objekt.

Wie Abt schon sagt, wenn du Clonen muss, dann stimmt was nicht in deiner Logik. Warum muss du 2 gleiche Objekt unterhalten?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

F
Fenriir |F13| Themenstarter:in
6 Beiträge seit 2014
vor 9 Jahren

ah, ok, das leuchtet ein. danke.

ich hab mich vielleicht unglücklich ausgedrückt. ich möchte nicht 2 gleiche objekte unterhalten, sonder eine "mutation" von einem objekt neben eben diesem speichern.
z.b.
objekt 1: x = 1
y = 1
z = 0

objekt 2: - übernimmt die werte von objekt 1
- der user ändert nur eine information, der rest bleibt gleich
x = 0
y = 1
z = 0

nun möchte ich objekt 2 speichern, ohne objekt 1 zu ändern...

16.807 Beiträge seit 2008
vor 9 Jahren

Sprich mal bitte Klartext, wofür das sein soll, so bringt das hier keinem was.

Soll das ein Undo-able Objekt werden, also Rückgängig-Möglichkeit?
Wenn ja nennt sich das "Verfahren" ganz einfach "undoable Object"; da solltest genug Beispiele finden.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Fenriir |F13|,

das zugrundeliegende Problem mit der Referenzsemantik fällt eindeutig unter Grundlagen, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Die Referenzsemantik von Referenztypen hat übrigens nichts mit dem ref-Schlüsselwort bei der Parameterübergabe zu tun.

Die Aufgabe, sich den Zustand eines Objekts zu merken und später wiederherzustellen, ist ein Standardproblem und fällt somit unter Punkt 1.1.

Stichworte sind Undo (wie von Abt genannt) und/oder Memento.

Ein Objekt zu kopieren ist meistens ein Hinweis auf schlechtes oder zumindest ungünstiges Design. Weiter Hinweise dazu gibt es in Kopie ohne ICloneable [oder warum man Objekte nicht kopieren sollte; Transaktionen auf Objekten]. In dem Codebeispiel dort wird eine Möglichkeit gezeigt, wie man Objekte realisieren kann, die mehr als eine "Mutation" haben.

Bitte beachte vor etwaigen weiteren Nachfragen bitte unbedingt [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.

herbivore