我目前在我的代码中有这个功能:
public static void GoToNextNode(Node<int> head)
{
head = head.GetNext();
}
这是我的主要功能:
Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
GoToNextNode(a2); // <---
但是,在执行箭头标记的行之后,它不会在整个节点列表中移动到下一个对象。
函数本身有效,但只有当我让它返回下一个值时它才会在主程序中起作用:
public static Node<int> GoToNextNode(Node<int> head)
{
return head.GetNext();
}
然后将主要功能更改为:
Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
a2 = GoToNextNode(a2); // <---
为什么第一个选项不起作用的任何想法? 提前谢谢!
答案 0 :(得分:5)
将对象传递给方法时,实际上并没有将该对象本身传递给该方法,而只传递引用。由于此引用本身由 value 传递,因此在该方法中对它的任何修改都不会反映在外部。这与以下内容没有任何不同:
```{r echo=FALSE}
blogdown::shortcode('tweet', '989470885475008512')
```
您当然可以在方法中为DoSomething(int i)
{
i = 3;
}
重新分配任何新值。但是,任何客户端代码都不会反映这一点,它仍然只会看到传递给方法的完全相同的值。或者换句话说:i
i
对DoSomething
所做的事情保持在DoSomething
,没有人会注意到它。
为了能够更改引用,您需要ref
-keyword。简而言之,它允许您修改传递给方法的引用,以便在调用GotoNextNode
之后参数a2
引用另一个实例:
public static void GoToNextNode(ref Node<int> head)
{
head = head.GetNext();
}
现在你可以这样称呼它:
GoToNextNode(ref a2);
当 - 另一方面 - 你只想修改实例的成员时,你不需要ref,如下所示:
void DoSometjng(MyClass a)
{
a.MyProperty = newValue;
}
如您所见,您没有重新引用a
,只是修改基础对象。现在,使用此代码的任何人都会看到该对象中的newValue
。
答案 1 :(得分:1)
方法内部更改的传递值不会在方法之外更改,除非您使用ref或out,这使编译器知道您希望更改方法内部的值以影响方法的值变量超出范围。
更改第一个节点示例的值
Public static void GoToNext ( ref Node <int> head)
{
head = head.getNext ();
}