gpt4 book ai didi

c# - 为什么函数不更改给定的节点(列表)?

转载 作者:行者123 更新时间:2023-11-30 20:16:13 25 4
gpt4 key购买 nike

我目前在我的代码中有这个功能:

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();
}

然后将main函数改成:

Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
a2 = GoToNextNode(a2); // <---

知道为什么第一个选项不起作用吗?提前致谢!

最佳答案

当您将对象传递给方法时,您实际上并没有传递该对象本身,而只是传递给该方法的引用。由于此引用本身由 value 传递,因此在该方法中对其进行的任何修改都不会反射(reflect)在外部。这与以下内容没有任何不同:

DoSomething(int i) 
{
i = 3;
}

您当然可以在方法中将任何新值重新分配给 i。然而,任何客户端代码都不会反射(reflect)这一点,它仍然只会看到传递给方法的完全相同的值。或者换句话说:您在 DoSomething 中使用 i 所做的事情停留在 DoSomething 中,没有人会注意到它。

为了能够更改引用,您需要 ref-keyword .简而言之,它允许您修改传递给您的方法的 reference,以便在调用 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

关于c# - 为什么函数不更改给定的节点(列表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50201962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com