ref和out有什么区别? (C#)

时间:2009-02-05 17:15:31

标签: c#

有任何简洁的解释吗?

还回答: Difference between ref and out parameters in .NET

6 个答案:

答案 0 :(得分:19)

对于来电者:

  • 对于ref参数,必须明确赋值变量
  • 对于out参数,变量不必明确赋值,但在方法返回后

方法:

  • ref参数从明确分配开始,并且 没有为其分配任何值
  • out参数开始明确分配,并且您必须确保无论何时返回(没有例外)它明确分配< / LI>

所以:

int x;
Foo(ref x); // Invalid: x isn't definitely assigned
Bar(out x); // Valid even though x isn't definitely assigned
Console.WriteLine(x); // Valid - x is now definitely assigned

...

public void Foo(ref int y)
{
    Console.WriteLine(y); // Valid
    // No need to assign value to y
}

public void Bar(out int y)
{
    Console.WriteLine(y); // Invalid: y isn't definitely assigned
    if (someCondition)
    {
        // Invalid - must assign value to y before returning
        return;
    }
    else if (someOtherCondition)
    {
        // Valid - don't need to assign value to y if we're throwing
        throw new Exception();
    }
    else
    {
        y = 10;
        // Valid - we can return once we've definitely assigned to y
        return;
    }
}

答案 1 :(得分:3)

最简洁的查看方式:

ref = inout

out = out

答案 2 :(得分:2)

请参阅MSDN上的this文章。他们都完成了微妙的不同事情。

答案 3 :(得分:1)

Ref和out参数传递模式用于允许方法更改调用者传入的变量。 ref和out之间的区别很微妙但很重要。每个参数传递模式都适用于稍微不同的编程方案。 out和ref参数之间的重要区别在于每个参数使用的明确赋值规则。

在调用之前,不需要将带out参数的方法的调用者分配给作为out参数传递的变量;但是,被调用者需要在返回之前分配out参数。

源: MSDN

答案 4 :(得分:1)

来自Alex提及的MSDN文章,

  

在调用之前,不需要将带out参数的方法的调用者分配给作为out参数传递的变量;但是,被调用者需要在返回之前分配out参数。

     

相比之下,ref参数被认为是被调用者最初分配的。因此,被调用者在使用前不需要分配给ref参数。

总而言之,在方法内部,您可以考虑设置ref参数,但不能考虑输出参数 - 您必须设置这些参数。 在方法之外,他们应该采取相同的行动。

答案 5 :(得分:0)

查看这篇Jon Skeet关于c#中的params的文章:

http://www.yoda.arachsys.com/csharp/parameters.html