当我构建一个二叉搜索树的简单实现时,我遇到了一些我不理解的东西。我将一个对象作为参数传递,编辑该对象并返回该对象。但它返回后并没有改变。
这是负责任的方法; (颜色为可读性:screenshot)
window.updateCell = function(){
// do stuff to cell
};
和方法调用:
window.updateCell = function(cell){
// do stuff to cell
};
结果: 1 2 3 4 5 6
预期结果: 5 6
有人可以解释为什么这段代码没有像我期望的那样表现吗?
答案 0 :(得分:0)
当您按值传递引用类型时,实际上是将引用(指针)复制到此对象并传递(放在堆栈上)此引用的副本。
您可以修改对象属性,因为两个引用显示堆中的一个实际对象。但是,如果您尝试修改引用的副本,它将不会导致源引用,因为您的调用方法具有原始引用。
引用类型的变量不直接包含其数据;它 包含对其数据的引用。传递引用类型时 参数值,可以更改指向的数据 引用,例如类成员的值。但是,你 不能改变引用本身的值;也就是说,你做不到 使用相同的引用为新类分配内存并拥有它 在街区外坚持。为此,请使用以下命令传递参数 引用或退出关键字。
另请参阅MSDN上的"Passing Reference-Type Parameters (C# Programming Guide)"文章。
答案 1 :(得分:0)
尝试通过引用'而不是'按值'传递引用,因此您应该能够在方法体内用新的指针替换指针。
尝试声明像这样的删除方法:
public BinarySearchTree Remove(ref Node current, int value)
...然后使用它:
var root = b.Root;
b = b.Remove(ref root , 1);
b = b.Remove(ref root , 2);
b = b.Remove(ref root , 3);
b = b.Remove(ref root , 4);
b.Root = root;