【发布时间】:2016-12-29 06:33:07
【问题描述】:
请理解我看到并关注了该问题,但不确定如何彻底解决该问题。我正在尝试运行我的 Add 方法,迭代直到找到我的密钥或当前节点为空,然后将 reference 返回到节点并分配它是否为空.我的代码(见 add 方法中的注释):
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 的全部意义在于尝试返回对已找到的任何节点的引用,即使它为空。在这种情况下,这是添加的第一项,因此 TraverseDown 方法应该返回对我的 _baseNode 的引用,默认为 null。然而,这只是将局部变量设置为 newNode,而 _baseNode 保持为空。
我确信对此有一个简单的答案,但我已经研究了一点,但一无所获。请,非常感谢任何帮助!
【问题讨论】:
标签: c# .net c#-4.0 null pass-by-reference