0

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

预期输出:开始-->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 函数中将节点添加到列表中,当控制权返回主函数时,它的值也不会保留。

对象是通过引用传递的,那么为什么它的值没有被持久化。如果我使用“ref”字,那么我会得到预期的结果。

阿图尔苏雷卡

4

3 回答 3

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);
于 2013-08-18T03:54:06.467 回答
2

因为 C#(也在 Java 中)中的引用是按值传递的。方法中实际使用的引用是传入的引用值的副本。(被引用的对象没有被复制)

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

于 2013-08-18T03:52:08.550 回答
0

为什么在传递对象时使用'ref'关键字?.

因为我在 AddNodeStart 中创建了一个新对象,所以值没有被持久化。如果我修改函数中的现有对象,那么更改将被保留。

于 2013-08-19T01:07:16.393 回答