将对象(通过引用传递)传递给函数不会保留更改

时间:2013-08-18 03:44:26

标签: c# .net

考虑以下代码,我正在尝试实现自定义链接列表。

预期输出:开始 - > 123 - > 11 - > NULL 实际输出:开始 - > 11 - > NULL

class MyLinkList
    {
        public object data { get; set; }

        public MyLinkList Next { get; set; }
    }

  public static void PrintLinkList(MyLinkList start)
        {
            Console.Write("Start-->");
            while (start != null)
            {
                Console.Write(start.data + "-->");
                start = start.Next;
            }
            Console.Write("NULL");
        }

  public static void AddNodeStart( MyLinkList start, object data)
        {
            MyLinkList newNode = new MyLinkList();
            newNode.data = data;
            newNode.Next = start;

            start = newNode;
        }

 public static void Main()
        {

            MyLinkList n = new MyLinkList() { data = 11, Next = null };

            AddNodeStart( n,123);

            PrintLinkList(n);

            Console.ReadLine();
        }

问题是即使节点被添加到AddToStart函数的列表中,当控制返回到main函数时,它的值也不会持久存在。

对象通过引用传递,然后为什么它的值不会被持久化。如果我使用'ref'字然后我得到了预期的结果。

Atul sureka

3 个答案:

答案 0 :(得分:3)

ref添加到方法声明中,如下所示:

public static void AddNodeStart(ref MyLinkList start, object data)

然后调用它

AddNodeStart(ref n,123);

它应该有用。

如果不这样做,那么start只是AddNodeStart方法中的变量 - 为其赋值不会改变存储在n中的引用。

那说这样做很不好吃。请考虑从add方法返回新节点。

public static MyLinkList AddNodeStart(MyLinkList start, object data)
{
    MyLinkList newNode = new MyLinkList();
    newNode.data = data;
    newNode.Next = start;
    return newNode;
}

然后这样称呼它:

n = AddNodeStart(n,123);

答案 1 :(得分:2)

因为C#中的引用(也是在Java中)通过按值传递。该方法中使用的实际引用是传入的引用值的副本。(不会复制引用的对象)

另一个例子是你不能通过将引用传递给方法来交换2个对象。由于所有引用都是按值传递的,因此实际交换的是复制的引用的

答案 2 :(得分:0)

Why use the 'ref' keyword when passing an object?回答答案。

由于我在AddNodeStart中创建了一个新对象,因此不会保持值。如果我修改函数中的现有对象,那么更改将保持不变。