3
 public class TreeNode
{
    public TreeNode Left;
    public TreeNode Right;
    public int Data { get; set; }

    public TreeNode(int data)
    {
        Left = null;
        Right = null;
        Data = data;
    }
}



   public class BinarySearchTree
{
    private TreeNode _root;

    public BinarySearchTree()
    {
        _root = null;
    }

    public void Insert(int data)
    {
        TreeNode tempNode = null;

        Insert(_root, tempNode);
    } 

    private void Insert(TreeNode treeNode, TreeNode newNode)
    {
        newNode = new TreeNode(3);
        treeNode = new TreeNode(4);
   }

この例では、public voidInsert(int data)メソッドは基本的にprivateメソッドを呼び出すだけであり、public void Insert(int data)メソッドの最後にブレークポイントを設定します。

通知_rootはまだnullで、tempNode4です。理由がわかりません。誰か説明してもらえますか?

4

3 に答える 3

3

参照によってクラスを渡すには、refキーワードを使用します。

private void Insert(ref TreeNode treeNode, ref TreeNode newNode)
{
    newNode = new TreeNode(3);
    treeNode = new TreeNode(4);
}

元のメソッドでは、クラスへの参照のコピーのみが渡され、参照によって渡されません。したがってnew、クラス参照のローカル コピーを置き換えるだけで、メソッドを呼び出すと元の参照値が保持されます。その結果、新しく作成された値は呼び出し元に返されません。

メソッドを変更しますInsert(data)(refキーワード コンパイラがないとエラーが発生します)。

public void Insert(int data)
{
    TreeNode tempNode = null;
    Insert(ref _root, ref tempNode);
} 

これは実際にはコンパイラの要件であり、渡されたオブジェクトがメソッド呼び出し後に他のオブジェクトに置き換えられる可能性があることを呼び出し元が認識していることを確認するためのものです。

outまた、キーワードについても読みたいと思うかもしれません。refパラメータは呼び出し前に初期化する必要がありますが、パラメータoutはメソッド内で初期化する必要があります。

于 2012-12-06T17:45:30.697 に答える
0

参照型を渡していますが、実際には参照のコピーを渡しています。そのコピーを更新しても、オリジナルは更新されません。

これを解決するには、メソッドが新しい値を返すようにします。または、out パラメータを使用するように関数を作り直すこともできます。

private void Insert(out TreeNode treeNode, out TreeNode newNode)
{
    newNode = new TreeNode(3);
    treeNode = new TreeNode(4);
}
于 2012-12-06T17:45:43.987 に答える
0

outパラメータの、およびref修飾子を見てください。たとえば、次のことができます。

private void Insert(ref TreeNode treeNode, TreeNode newNode)
于 2012-12-06T17:46:15.577 に答える