2015-11-02 90 views
0

在C#中將參數列表作爲參數傳遞的優點是什麼? 列表不是一個值類型,因此每次修改都會在返回該函數後反映出來。傳遞列表參數爲參考

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myClass = new MyClass(); 
     var list = new List<string>(); 
     myClass.Foo(ref list); 

     foreach (var item in list) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 

class MyClass 
{ 
    public void Foo(ref List<string> myList) 
    { 
     myList.Add("a"); 
     myList.Add("b"); 
     myList.Add("c"); 
    } 
} 

我可以刪除「ref」,它會正常工作。 所以我的問題是我們需要添加ref關鍵字的列表,數組... 感謝

+0

MSDN文檔解釋了這種非常情況下:https://msdn.microsoft.com/en-us/library/14akc2c7(v = vs.120)的.aspx;只是RTFM – ASh

+0

http://stackoverflow.com/questions/4482264/list-collection-object-as-method-parameter – Sayyid

回答

2

什麼用法這將創建一個新的列表,它會從外部替代list變量:

public void Foo(ref List<string> myList) 
{ 
    myList = new List<string>(); 
} 

這不會從外部更換list變量:

public void Foo(List<string> myList) 
{ 
    myList = new List<string>(); 
} 
0

裁判關鍵字使一個參數通過引用傳遞,而不是按價值。 列表是一個引用類型。在你的例子中,你試圖通過引用傳遞對象也使用ref關鍵字的方法參數。

這意味着你正在做同樣的事情。在這種情況下,您可以刪除ref關鍵字。

ref當你想通過引用傳遞一些Value類型時需要。 例如:

class MyClass 
{ 
    public void Foo(ref int a) 
    { 
     a += a; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int intvalue = 3; 
     var myClass = new MyClass(); 
     myClass.Foo(ref intvalue); 
     Console.WriteLine(intvalue); // Output: 6 
    } 
} 

你可以找到有一些額外的規格信息:ref (C# Reference)