2013-08-18 81 views
1

考虑下面的代码,我试图实现自定义链接列表。将对象(通过引用传递)传递给函数不会保持更改

期望输出:开始 - > 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'字,那么我会得到预期的结果。

阿图尔sureka

回答

2

因为(还用Java)C#中的基准由值传递。方法中使用的实际引用是传入的参考值的副本。(被复制的对象不会被复制)

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

3

添加ref到您的方法声明如下所示:

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

然后调用它

AddNodeStart(ref n,123); 

,它应该工作。

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

这就是说这样做的感觉相当糟糕。请考虑从您的添加方法中返回新节点。

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

然后调用它是这样的:

n = AddNodeStart(n,123);