2016-07-03 17 views
0

Arbeit habe ich eine Klasse Knoten wie folgt:C# Objektinstanz nicht richtig

public class Node 
{ 
    public Dictionary<string, string> dictionary; 
    public Node(Dictionary<string, string> dictionary) 
    { 
     this.dictionary = dictionary; 
    } 
    public void CreateNode() 
    { 
     this.dictionary.Add("1", "String1"); 
     Dictionary<string, string> dictionary1 = new Dictionary<string, string>(); 
     Console.WriteLine(this.dictionary["1"]); 
     Node tmp = new Node(dictionary1); 
     tmp.dictionary = this.dictionary; 
     Console.WriteLine(tmp.dictionary["1"]); 
     tmp.AddE(tmp, "String2","2"); 

     Console.WriteLine(this.dictionary["2"]); 
    } 
    public void AddE(Node tmp,String text,string c) 
    { 
     tmp.dictionary.Add(c,text); 
    }    
} 

Knoten hat ein Wörterbuch mit String-Schlüssel und Wert, einen Konstruktor mit Parameter, ein Verfahren CreateNode() Das fügt dem Wörterbuch ein Element hinzu und erstellt ein weiteres Knoten. Nun, nach tmp.dictionary = this.dictionary; ein weiterer Artikel wird um tmp.dictionary hinzugefügt, aber es ist auch bei this.dictionary hinzugefügt (Ich will das nicht passieren, ich vermisse smth).

Hauptmethode:

static void Main(string[] args) 
{ 
    Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
    Node n = new Node(dictionary); 
    n.CreateNode(); 
} 

Ausgang ist:

String1 
String1 
String2 

Für diese Codezeile Console.WriteLine (this.dictionary [ "2"]); sollte es diesen Fehler zeigen KeyNotFoundException: Der angegebene Schlüssel war nicht im Wörterbuch vorhanden., weil ich kein Element mit Schlüssel "2" um this.dictionary hinzugefügt habe. Hoffe ich habe mich klar gemacht.

+1

Ihr Code ist * wirklich * verschleiert. Die Tatsache, dass Sie zwei verschiedene Wörterbücher eingebunden haben und dass Sie eine Instanzmethode in 'Node' haben, die einen anderen' Node' akzeptiert, aber nichts mit dem Ziel des Methodenaufrufs tut, verwirren die Dinge massiv. –

+1

Asteam bitte fügen Sie keine Antwort in Frage - wenn Sie der Meinung sind, dass vorhandene Antworten das Problem nicht gelöst haben, schreiben Sie Ihre eigene Antwort als separate Antwort –

+0

Und nur Code wäre nicht wirklich eine Antwort darauf, warum Sie das aktuelle Verhalten sowieso sehen. –

Antwort

7

, weil ich ein Element mit Schlüssel "2" in diesem Wörterbuch nicht hinzugefügt habe.

Ja haben Sie. Sie haben es mit diesem Aufruf:

tmp.AddE(tmp, "String2","2"); 

, dass ein Eintrag mit der Taste „2“ und den Wert „String2“ in das Wörterbuch, das das gleiche Wörterbuch ist von tmp ... bezeichnet fügt hinzu, dass this darauf zurückzuführen bezieht Leitung:

tmp.dictionary = this.dictionary; 

Das zweite Wörterbuch, das Sie mit der Linie erstellt:

Dictionary<string, string> dictionary1 = new Dictionary<string, string>(); 

... ist für die Garbage collection förderfähig, weil nichts verweist dazu später. Es ist zunächst das Wörterbuch im neuen tmp Knoten, aber dann ersetzen Sie das mit dem Verweis auf das gleiche Wörterbuch in "dieser", wie oben gezeigt.

Randbemerkung: Versuchen Sie, solch verwirrenden Code zu vermeiden. Ein Verfahren wie das ist ein Rezept von Problemen:

public void AddE(Node tmp,String text,string c) 
{ 
    tmp.dictionary.Add(c,text); 
} 

Das ist eine Instanz Methode ist, aber es ist nicht der Zustand des „aktuellen“ Instanz zu verwenden (das this bezieht) - stattdessen es ändert den Zustand des Knotens, der in übergeben wird Es wäre besser geschrieben werden. mit anderen Worten

public void AddE(String text, string c) 
{ 
    this.dictionary.Add(c,text); 
} 

..., anstatt den Zustand der this ändern.(Es ist immer noch seltsam vorbei den Schlüssel nach des Wert und ein Parameter namens c liefert keinen Hinweis, was es bedeutet, ist für sein, aber das ist eine andere Sache.)

+0

Logic Probleme überall ... –

+0

Danke für Ihre Antwort, verstanden Sie perfekt. Ich habe es so gelöst (Antwort auf meine Frage hinzugefügt). – ASTeam