ref与out参数之间有什么区别?

时间:2013-04-24 16:07:07

标签: c# parameters

在C#中,refout参数有什么区别?

示例:

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

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

另外,每种方法的使用指南是什么?

2 个答案:

答案 0 :(得分: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的别名变量。这是合法的:

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具有相同的实施方式;唯一的区别是编译器如何跟踪变量是否被分配。

使用指南是:

  • 如果可以避免它们,请避免使用它们。
  • 如果您无法避免它们,当您通过修改变量和“ref”逻辑返回值时,使用“out”,当您读取变量的值时,然后可能修改变量。 out 必须修改,并且必须读取(在修改之前)。在修改之前,ref 可以修改并且可以读取。

答案 1 :(得分: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

相关问题