意外的参数行为-按值而不是引用传递

时间:2019-09-06 18:12:52

标签: c#

使用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;
}

我在这里想念什么?

0 个答案:

没有答案