使用Python多年后,我将切换回C#,并且在将对象传递给函数时看到一些意外行为。具体来说,我正在使用链接列表进行一些练习。这是我的节点和列表代码:
public class MyLinkedListNode<T>
{
public T Value;
public MyLinkedListNode<T> Next;
public MyLinkedListNode(T value)
{
Value = value;
Next = null;
}
}
public class MyLinkedList<T>
{
public MyLinkedListNode<T> Head;
public MyLinkedListNode<T> Tail;
public MyLinkedList()
{
Head = Tail = null;
}
public void InsertAtEnd(T value)
{
var newNode = new MyLinkedListNode<T>(value);
if (Tail == null)
{
Head = Tail = newNode;
return;
}
Tail.Next = newNode;
Tail = newNode;
}
}
在整理一些单元测试以进行练习时,我注意到将MyLinkedList的Head节点传递给方法时的奇怪行为。它似乎作为值而不是引用传递。当我执行以下操作时,由于MyLinkedListNode是一个对象,因此我希望将list.Head作为对MakeHeadNull()的引用传入。然后,我希望在调用方中将list.Head设置为null。但是,我发现它保留了其价值。
MyLinkedList <int> list = new MyLinkedList<int>();
list.InsertAtEnd(1);
MakeHeadNull(list.Head);
Assert.Null(list.Head); //**FAILS**
public void MakeHeadNull(MyLinkedListNode<int> head)
{
head = null;
}
如果我更改方法以将参数显式设置为引用参数,则代码将按预期工作,这似乎可以确认它是通过上面的值传递的。
MakeHeadNull(ref list.Head);
Assert.Null(list.Head); //**PASSES**
public void MakeHeadNull(ref MyLinkedListNode<int> head)
{
head = null;
}
我在这里想念什么?