ref not working -不改变属性

本文关键字:改变 属性 not working ref | 更新日期: 2023-09-27 18:12:10

我正在使用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时,例如根会在第一次插入期间改变。然而,事实并非如此。根仍然为空。我怀疑这与属性以及它如何与ref而不是ref本身相互作用更相关?

ref not working -不改变属性

您正在修改本地根变量,因为这是您传入的引用。如果你想让它工作,你需要把它重新分配给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);
}