C# 为什么';功能是否更改给定节点(列表)?
我目前在代码中有此功能:C# 为什么';功能是否更改给定节点(列表)?,c#,nodes,C#,Nodes,我目前在代码中有此功能: public static void GoToNextNode(Node<int> head) { head = head.GetNext(); } 公共静态void GoToNextNode(节点头) { head=head.GetNext(); } 这是我的主要职责: Node<int> a1 = new Node<int>(5); Node<int> a2 = new Node<int>(5,
public static void GoToNextNode(Node<int> head)
{
head = head.GetNext();
}
公共静态void GoToNextNode(节点头)
{
head=head.GetNext();
}
这是我的主要职责:
Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
GoToNextNode(a2); // <---
节点a1=新节点(5);
节点a2=新节点(5,a1);
GoToNextNode(a2);// 当您将一个对象传递给一个方法时,实际上并没有将该对象本身传递给该方法,而只是将对该对象的引用传递给该方法。由于该引用本身是通过值传递的,因此该方法中对它的任何修改都不会反映在外部。这与以下内容没有任何不同:
DoSomething(int i)
{
i = 3;
}
当然,您可以将任何新值重新分配给方法中的i
。然而,任何客户端代码都不会反映这一点,它仍然只会看到传递到方法中的完全相同的值。或者换句话说:你在DoSomething
中对i
所做的事情停留在DoSomething
上,没有人会注意到它
要能够更改引用,您需要。简而言之,它允许您修改传递给方法的引用,以便在调用GotoNextNode
后,参数a2
引用另一个实例:
public static void GoToNextNode(ref Node<int> head)
{
head = head.GetNext();
}
另一方面,如果只想修改实例的成员,则不需要ref,如下所示:
void DoSometjng(MyClass a)
{
a.MyProperty = newValue;
}
如您所见,您不是在重新引用a
,而是在修改底层对象。现在,无论谁使用此代码,都会在该对象中看到newValue
在方法内部更改的传递值不会在方法外部更改,除非您使用ref或out,这让编译器知道您希望在方法内部更改值以使变量的值超出范围
更改第一个节点示例的值的步骤
Public static void GoToNext ( ref Node <int> head)
{
head = head.getNext ();
}
publicstaticvoidgotonext(参考节点头)
{
head=head.getNext();
}
不确定,但可能是因为您的第一次调用复制了节点。要执行我假设您想执行的操作,我猜GoToNextNode
代码应该是:head=head.GetNext()
,返回void
@diegrafaelsouza在C#中没有任何内容是通过引用传递的,所有内容都是通过值传递的-除非您使用ref
告诉您的程序这样做。从什么时候开始?在过去的一年里,C#的变化是否如此之大,以至于现在所有的对象都按值传递?C#一直按值传递,除非被告知不要这样做,它是由两个东西组成的。当然,您可以修改作为方法引用传递的对象的成员。但是,除非您使用的是ref
,否则无法更改方法中的引用。因此,引用本身——这就是您传递给方法的内容——始终作为值传递。@EmanuelL通过向数组中添加数字,您不会更改对该数组的引用,而只更改其内容(其成员)。要做到这一点,您不需要ref关键字,对引用的实例所做的每一次修改都会反映在对它的所有引用中。
GoToNextNode(ref a2);
void DoSometjng(MyClass a)
{
a.MyProperty = newValue;
}
Public static void GoToNext ( ref Node <int> head)
{
head = head.getNext ();
}