使用参考值作为参数,带或不带“ref"”

本文关键字:quot ref 参考 参数 | 更新日期: 2023-09-27 18:07:10

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

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

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

有区别吗,我选哪一个有关系吗?接口是一个参考值,无论如何都会给出参数作为引用,"ref"也会得到引用…我想我可以忽略"裁判"这个词……我想知道为什么编译器不给我一个错误…

使用参考值作为参数,带或不带“ref"”

有区别吗?

是的,有。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];
}

在第一种情况下,您替换"全局"(方法之外)参数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
}

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

如果你只想使用返回的List<Label>,你应该使用不带ref的选项。