我遇到了两个解决方案(两个都工作):
public List<Label> foo1(ref ISomeInterface[] all)
或
public List<Label> foo2(ISomeInterface[] all)
是否存在差异,我采取了哪些问题?接口是一个参考值,无论如何都会给参数作为参考,“ref”也会得到参考...我想我可以解雇“ref”......我想知道为什么编译器不会给我一个错误...
答案 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>
,则应使用不带参考的选项。