为何GoToNextNode函数无法修改传入的链表Node对象?
为什么调用GoToNextNode后链表节点没切换?
这是个非常典型的C#参数传递误区,咱们一步步拆解问题根源,再给出解决办法:
首先先还原你遇到问题的代码:
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); // 执行后发现a2还是原来的节点,并没有切换到a1
问题根源:引用类型的按值传递
你可能以为引用类型传参就是直接操作原对象,但在C#里,引用类型的参数默认是按值传递的——这里的“值”指的是引用本身。也就是说,函数里的head变量是你传入的a2引用的一个副本。当你在函数里执行head = head.GetNext()时,只是把这个副本的指向改成了下一个节点,但主函数里的a2这个原引用完全没被改动,所以函数执行完后,a2自然还是指向原来的节点。
两种可行的解决方案
方案1:让函数返回下一个节点的引用
最简单的方式就是修改函数,让它返回新的节点引用,然后在主函数里把返回值赋值给原变量:
public static Node<int> GoToNextNode(Node<int> head) { return head.GetNext(); } // 主函数调用时接收返回值 a2 = GoToNextNode(a2); // 现在a2就会正确指向a1了
方案2:使用ref关键字实现按引用传递
如果不想用返回值的方式,可以用ref关键字让参数真正按引用传递,这样函数里对head的修改会直接作用于主函数里的原变量:
public static void GoToNextNode(ref Node<int> head) { head = head.GetNext(); } // 主函数调用时必须加上ref关键字 GoToNextNode(ref a2); // 执行后a2会成功切换到下一个节点
内容的提问来源于stack exchange,提问作者Emanuel L
相关产品推荐
相关产品推荐

