按值传递对象,编辑对象并将其发回

时间:2016-10-30 14:35:52

标签: c#

当我构建一个二叉搜索树的简单实现时,我遇到了一些我不理解的东西。我将一个对象作为参数传递,编辑该对象并返回该对象。但它返回后并没有改变。

这是负责任的方法; (颜色为可读性:screenshot

window.updateCell = function(){ 
  // do stuff to cell
};

和方法调用:

window.updateCell = function(cell){ 
  // do stuff to cell
}; 

结果: 1 2 3 4 5 6

预期结果: 5 6

有人可以解释为什么这段代码没有像我期望的那样表现吗?

2 个答案:

答案 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;