有任何简洁的解释吗?
答案 0 :(得分:19)
对于来电者:
方法:
所以:
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的文章: