2015-11-02 91 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)