考虑以下代码,我正在尝试实现自定义链接列表。
预期输出:开始 - > 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
答案 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中创建了一个新对象,因此不会保持值。如果我修改函数中的现有对象,那么更改将保持不变。