Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';功能是否更改给定节点(列表)?_C#_Nodes - Fatal编程技术网

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