2013-08-18 78 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);