ref和out有什么区别?


What is the difference between ref and out? (C#)

本问题已经有最佳答案,请猛点这里访问。

有什么简明的解释吗?

另请回答:.NET中的ref和out参数之间的差异


来电者:

  • 对于一个引用参数,变量必须已经被明确地赋值。
  • 对于out参数,变量不必被明确地赋值,而是在方法返回之后

对于该方法:

  • 一个引用参数开始时是明确指定的,您不必为它指定任何值。
  • out参数不会以明确分配的方式开始,您必须确保在返回时(无例外),它将被明确分配。

所以:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 = IOUT

出=出


请参阅有关msdn的这篇文章。实际上,他们都完成了微妙的不同的事情。


从Alex提到的msdn文章中,

The caller of a method which takes an out parameter is not required to assign to the variable passed as the out parameter prior to the call; however, the callee is required to assign to the out parameter before returning.

In contrast ref parameters are considered initially assigned by the callee. As such, the callee is not required to assign to the ref parameter before use.

综上所述,在方法内部,您可以考虑设置引用参数,但不能设置out参数——您必须设置这些参数。在方法之外,它们的行为应该相同。


ref和out参数传递模式用于允许方法更改调用方传入的变量。裁判和出局之间的区别很微妙,但很重要。每个参数传递模式都被设计为应用于稍微不同的编程场景。out和ref参数之间的重要区别是每个参数使用的明确的赋值规则。

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

来源:MSDN


看看这篇关于c中参数的jon skeet文章:

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