分配给NULL参考类型



请理解我看到并遵循问题,但是不确定如何干净地解决它。我正在尝试运行我的 add 方法,迭代直到找到我的键或当前节点为null,然后将 reference 返回到节点,并分配如果为null。我的代码(请参阅添加方法中的注释):

public class MyClass<TKey, TValue>
{
    private Node _baseNode;
    public void Add(TKey key, TValue value)
    {
        var newNode = new Node(key, value);
        //this returns null, as is expected.
        var nodeToUpdate = TraverseDown(ref _baseNode, newNode.Key);
        if (nodeToUpdate != null)
            throw new ArgumentException("Cannot add a duplicate key.");
        //here, I try to assign a value to _baseNode because I'd like
        //nodeToUpdate to hold the reference to _baseNode
        nodeToUpdate = newNode;
    }
    private Node TraverseDown(ref Node currentNode, int keyToFind)
    {
        if (currentNode == null || currentNode?.Key == keyToFind 
            || currentNode?.Edge == null)
        {
            //on first add, this is what is getting hit - as expected
            return currentNode;
        }
        else
        {
            //these are being explicitly set to local variables because i was 
            //experimenting with passing them byRef, and that can't be done on 
            //properties
            var leftNode = currentNode.Edge.LeftNode;
            var rightNode = currentNode.Edge.RightNode;
            return keyToFind < currentNode.Key 
                            ? TraverseDown(ref leftNode, keyToFind) 
                            : TraverseDown(ref rightNode, keyToFind);
        }
    }
}

让traversedown方法接受节点 byref 的整个点是尝试返回对发现的任何节点的引用,即使它为null。在这种情况下,这是要添加的第一个项目,因此Traversedown方法应返回对我的_basenode的引用,默认值为null。但是,这只是将局部变量设置为newNode,而_basenode保持为空。

我敢肯定,这有一个简单的答案,但是我一直在研究一点,什么也没发现。请感谢任何帮助!

您的TraverseDown方法中没有行实际分配ref currentNode。相反,您返回其值。当您通过ref参数时,并不意味着该值将被视为整个方法范围内的参考。参数本身将被视为参考,而不是其值。所以当你写...

return currentNode;

您返回currentNode value ,而不是参考。由于该值为null,因此您始终返回null(由于您的if (currentNode == null...语句)。

分配...

nodeToUpdate = newNode;

...您只需分配null参考。

当您实际想在TraverseDown中为_baseNode分配一个值时,您需要在方法中设置currentNode

currentNode = //Value

请注意,在C#7.0中将有ref返回,这些裁判以某种方式以您的方法处理currentNode

相关内容

  • 没有找到相关文章

最新更新