2016-10-09 14 views
0

私はrefを使って作成しようとしているバイナリ検索ツリーのルートを変更しますが、意図したとおりに動作しません。refは機能しません - プロパティは変更されません

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); 
    } 

私は私が行うときroot = newNodeことは、例えばルートが最初のインサート中に変更することを期待していました。しかし、そうではありません。その後もRootはnullのままです。私はこれがプロパティにもっと関連するものであり、ref自体ではなくrefとどのように相互作用するのか疑問に思っています。それはあなたが渡している参照ですので、あなたは、ローカルルート変数を変更している

+0

だけでデバッグポイントを入れて、期待どおりに働いていない理由を確認し、それが参照型が作る、修正を試してみてください –

+0

作業方法に関係していますヌルが未定義であるため、ルートプロパティはnullではありませんce –

答えて

4

あなたはこれが仕事をしたい場合は、そのようにようにバックRootプロパティに割り当てる必要があります。

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

    Root = root; 
    return result; 
} 

おそらくクリーナーオプションは、直接そのようなプロパティのバッキングフィールドを使用することです:

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

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

良い点は、なぜ参照型のケースであるのか説明することができます –

+0

プロパティのバッキングフィールドを作成すると解決すると思っていましたが、get/setに特別なロジックがない場合自動プロパティ。しかし、隠されたフィールドを変更しようとしているrefで使用すると問題があるようです。 – Naz

+0

また、 'Root = root'を割り当てる問題は、複数の挿入のように、ルートの後に何かを挿入すると、毎回ルートを変更するだけではないということですか? – Naz

関連する問題