Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Ungewollter Datenzugriff in Dictionary
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

Ungewollter Datenzugriff in Dictionary

beantworten | zitieren | melden

Moderationshinweis von herbivore (03.06.2014 - 15:57:51):

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.


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
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5967
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

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.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

beantworten | zitieren | melden

so is das. muss ich da mit der clone-methode arbeiten? und wieso geht das auf diese weise nich?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15816
Herkunft: BW

beantworten | zitieren | melden

Wenn man Clonen MUSS, dann stimmt in den meisten Fällen der gesamte Code strukturell schon nicht.
private Nachricht | Beiträge des Benutzers
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

beantworten | zitieren | melden

welche alternative gibts denn noch?
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

beantworten | zitieren | melden

Zitat
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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion

Moderationshinweis von Abt (05.06.2014 - 11:49:45):

Und [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

private Nachricht | Beiträge des Benutzers
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

beantworten | zitieren | melden

guck ich mir an, danke schonmal!
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Zitat von Fenriir |F13|
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.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Fenriir |F13|
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Norddeutschland

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15816
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers