-3

ref在 C# 中,和out参数有什么区别?

例子:

void method1(ref int p1)
{
 //....
}

void method2(out int p2)
{
 //....
}

另外,每个的使用指南是什么?

4

2 回答 2

12

ref 参数和 out 参数都为变量创建别名。也就是说,当你说:

M(int x) { ... }
...
int y = 123;
M(y);

然后传递 y 的,并且 x 获取该值的副本。

当你说

N(ref int x) { ... }
...
int y = 123;
N(ref y);

那么x 和 y 是同一个变量的两个名称。对 x 的更改会导致对 y 的更改。

从调用者的角度来看, ref 和 out 之间的唯一区别是,由 ref 别名的变量必须在 call 之前明确分配。这是合法的:

O(out int x) { ... }
...
int y; // no initialization!
O(out y);

但这不是:

N(ref int x) { ... }
...
int y; // no initialization!
N(ref y);

从被调用者的角度来看,唯一的区别是:

  • ref可以假设最初分配了一个参数;out参数不能。
  • out必须在控制正常离开方法之前分配参数。也就是说,这是非法的:

    void O(out int x) { return; }

    x必须在返回之前分配。

在幕后,refout有同样的实现;唯一的区别是编译器如何跟踪变量是否被赋值。

它们的使用指南是:

  • 如果您可以避免它们,请避免它们。
  • 如果您无法避免它们,请在通过修改变量逻辑返回值时使用“out”,在读取变量的值然后可能修改变量时使用“ref” 。一个 out必须修改,并且不能读取(修改之前)。ref可以修改并且可以在修改之前读取。
于 2013-04-24T16:17:42.987 回答
4

直接来自 MSDN 文档:

out 关键字导致参数通过引用传递。这类似于 ref 关键字,不同之处在于 ref 要求在传递变量之前对其进行初始化。

来源: http: //msdn.microsoft.com/en-US/library/t3c3bfhx (v=vs.80).aspx

我觉得这已经够清楚了。如果这不能回答您的问题,请告诉我。

另一个懒惰的例子的复制粘贴:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

因此,在这种情况下,如果是这样,则Method(ref int i)该方法将要求i首先对其进行初始化。

于 2013-04-24T16:12:21.940 回答