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

有任何简洁的解释吗?

还回答: .NET中ref和out参数之间的区别

对于来电者:

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

对于方法:

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

所以:

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; } } 

最简洁的查看方式:

ref = inout

out = out

请参阅MSDN上的这篇文章。 真的,他们都完成了微妙的不同。

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

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

来源: MSDN

从Alex提到的MSDN文章中,

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

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

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

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

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