使用参考值作为参数,有没有“ref”?

时间:2015-08-10 07:58:02

标签: c# interface pass-by-reference

我遇到了两个解决方案(两个都工作):

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

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

是否存在差异,我采取了哪些问题?接口是一个参考值,无论如何都会给参数作为参考,“ref”也会得到参考...我想我可以解雇“ref”......我想知道为什么编译器不会给我一个错误...

3 个答案:

答案 0 :(得分:3)

  

是否存在分歧?

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

一个例子:

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

答案 1 :(得分:2)

在第一种情况下,您将替换&#34; global&#34; (方法之外)参数all。在第二种情况下,您将替换all参数的本地副本。

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
}

答案 2 :(得分:0)

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

如果您只想使用返回的List<Label>,则应使用不带参考的选项。