将列表参数作为引用传递

7

将列表作为引用参数传递的优点是什么? List不是值类型,因此对其进行的每个更改都会在返回函数后反映出来。

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 关键字? 谢谢。

MSDN文档解释了这个情况:https://msdn.microsoft.com/zh-cn/library/14akc2c7(v=vs.120).aspx;只需要好好阅读文档。 - ASh
http://stackoverflow.com/questions/4482264/list-collection-object-as-method-parameter - Fayyaz Naqvi
2个回答

7
ref关键字使参数按引用传递,而不是按值传递。 List是一种引用类型。在您的示例中,您正在尝试使用ref关键字将对象按引用传递给方法参数。
这意味着您正在做同样的事情。在这种情况下,您可以删除ref关键字。
当您想通过引用传递某些Value类型时,需要使用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
    }
}

你可以在这里找到一些附加的规范信息:ref (C# 参考)


6

这将创建一个新的列表并替换外部的list变量:

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

这不会替换来自外部的list变量:
public void Foo(List<string> myList)
{
    myList = new List<string>();
}

3
默认情况下,集合作为引用传递,因此声明不带 ref 关键字的列表不会被替换是错误的。 - Aistis Taraskevicius
有趣的概念。尽管列表是引用,但在参数中不声明ref会确定新实例是否覆盖原始引用或在内存中创建一个与原始引用分离的单独实例。通过找到行为上的实际差异,我相信这确实是正确的答案,尽管最初看起来似乎不正确! - Radderz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接