2016-10-09 2 views
0

Ich benutze Ref, so dass es die Wurzel des binären Suchbaums ändert Ich versuche zu erstellen, aber es funktioniert nicht so, wie ich es vorhabe.ref funktioniert nicht - ändert nicht die Eigenschaft

public BinaryNode<T> Root { get; set; } 
    public BinaryTree() : base() 
    { 
     Root = null; 

    public T Insert(ref BinaryNode<T> root, T val) 
    { 
     // Insert here 
     if (root == null) 
     { 
      BinaryNode<T> newNode = new BinaryNode<T>(val); 
      root = newNode; 
      Size++; 
      return val; 
     } 

     if (val.CompareTo(root.Data) < 0) 
     { 
      BinaryNode<T> left = root.LeftChild; 
      return Insert(ref left, val); 
     } 

     else if (val.CompareTo(root.Data) > 0) 
     { 
      BinaryNode<T> right = root.RightChild; 
      return Insert(ref right, val); 
     } 

     return val; 
    } 

    public override T Insert(T val) 
    { 
     BinaryNode<T> root = Root; 
     return Insert(ref root, val); 
    } 

Ich habe erwartet, dass, wenn ich root = newNode, dass der Start während des ersten Einsatzes zum Beispiel ändern würde. Dies ist jedoch nicht der Fall. Root bleibt auch nachher null. Ich vermute, dass dies eher etwas mit Eigenschaften zu tun hat und wie es mit ref anstatt ref selbst interagiert?

+0

einfach einen Debug-Punkt setzen und prüfen, warum es nicht wie erwartet funktioniert, hat es mit Art und Weise Referenztypen zu arbeiten –

+0

eine Modifikation Versuchen sie, machen Root-Eigenschaft nicht null, da null nicht definiert ist ce –

Antwort

4

Sie ändern den lokalen Stamm variabel, da, dass der Verweis der Sie vorbei in Wenn Sie diese benötigen Sie arbeiten möchten, dann ist es wie so auf die Root-Eigenschaft zuweisen zurück.

public T Insert(T val) 
{ 
    BinaryNode<T> root = Root; 
    var result = Insert(ref root, val); 

    Root = root; 
    return result; 
} 

Vielleicht ein sauberer Option wäre direkt ein Trägerfeld wie so für die Eigenschaft zu verwenden:

BinaryNode<T> _root; 
public BinaryNode<T> Root 
{ 
    get { return _root; } 
    set { _root = value; } 
} 

public T Insert(T val) 
{ 
    return Insert(ref _root, val); 
} 
+0

Guter Punkt können Sie auch erklären, warum ist das der Fall für Referenztypen –

+0

Ich dachte, dass die Schaffung eines Backing-Feld für die Eigenschaft würde es lösen, aber ich lese, wenn es keine spezielle Logik in der get/set zu verwenden Auto-Eigenschaften. Aber es scheint, dass es Probleme gibt, wenn man mit ref versucht, das versteckte Feld zu ändern. – Naz

+0

Auch das Problem mit der Zuweisung von "Root = root" ist, dass, wenn ich etwas nach der Wurzel einfügen, wie mehrere Insertionen, würde das nicht nur die Root jedes Mal ändern? – Naz

Verwandte Themen