关于c#:使用参考值作为参数,有没有“ref”?

Using a reference value as parameter, with or without “ref”?

本问题已经有最佳答案,请猛点这里访问。

我遇到了两个解决方案(两个都有效):

1
 public List<Label> foo1(ref ISomeInterface[] all)

1
 public List<Label> foo2(ISomeInterface[] all)

有没有不同之处,我选哪一个重要?接口是一个引用值,无论如何都会给出参数作为引用,"ref"也会得到引用…我想我可以去掉"ref"…我想知道为什么编译器不给我一个错误…


Is there a diffrerence?

是的,有。C中的所有内容都按值传递。当通过ref传递引用类型时,传递的是实际的引用指针,而不是副本。这样,如果您通过ref传递一个引用类型,并通过new关键字将其设置为一个新的引用,那么您将更改该引用。

一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void Main(string[] args)
{
    ISomeInterface[] somes = new[] { new SomeConcreteType() }
    Foo(somes);
    Console.WriteLine(somes.Length) // Will print 1
    Foo(ref somes);
    Console.WriteLine(somes.Length) // Will print 0
}

public List<Label> Foo(ref ISomeInterface[] all)
{
    all = new ISomeInterface[0];
}
public List<Label> Foo(ISomeInterface[] all)
{
    all = new ISomeInterface[0];
}

在第一种情况下,您将替换"global"(out of method)参数all。在第二种情况下,您将替换all参数的本地副本。

1
2
3
4
5
6
7
8
9
public List<Label> foo1(ref ISomeInterface[] all)
{
    all = new ISomeInterface[0]; //you will get empty array outside method
}

public List<Label> foo1(ISomeInterface[] all)
{
    all = new ISomeInterface[0]; //you will get empty array only inside method
}


这取决于您要对数组做什么。如果要修改foo1方法中的值并在foo1方法之外使用这些修改,则可以使用ref类型的版本。

如果您只想使用返回的List,则应使用不带引用的选项。