C# 将列表参数作为ref传递

C# 将列表参数作为ref传递,c#,list,ref,C#,List,Ref,在C#中将列表作为参数作为ref传递有什么好处? 列表不是值类型,因此对它所做的每个更改都将在返回函数后反映出来 class Program { static void Main(string[] args) { var myClass = new MyClass(); var list = new List<string>(); myClass.Foo(ref list); foreach (var

在C#中将列表作为参数作为ref传递有什么好处? 列表不是值类型,因此对它所做的每个更改都将在返回函数后反映出来

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");
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var myClass=新的myClass();
var list=新列表();
myClass.Foo(参考列表);
foreach(列表中的变量项)
{
控制台写入线(项目);
}
}
}
类MyClass
{
公共作废Foo(参考列表myList)
{
myList.添加(“a”);
myList.添加(“b”);
myList.添加(“c”);
}
}
我可以删除“参考”,它会很好地工作。 所以我的问题是,我们需要为列表、数组添加ref关键字有什么用途。。。
谢谢

这将创建新列表,并将替换来自外部的
列表
变量:

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

ref关键字导致参数通过引用传递,而不是通过值传递。 列表是一种引用类型。在您的示例中,您试图通过引用传递对象到方法参数,同时使用ref关键字

这意味着你在做同样的事情。在这种情况下,您可以删除ref关键字

当您希望通过引用传递某些值类型时,需要使用ref。 例如:

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
    }
}

您可以在这里找到一些其他规范信息:

msdn文档解释了这种情况:;默认情况下,只是将RTFMCollections作为引用传递,因此声明在没有ref关键字的情况下列表不会被替换是错误的。