【问题标题】:What is the difference between ref and out? (C#) [duplicate]ref 和 out 和有什么不一样? (C#)[重复]
【发布时间】:2009-02-05 17:15:31
【问题描述】:

有什么简洁的解释吗?

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

【问题讨论】:

标签: c#


【解决方案1】:

对于调用者:

  • 对于 ref 参数,变量必须已经明确分配
  • 对于out参数,变量不一定要明确赋值,而是在方法返回后进行

对于方法:

  • 一个 ref 参数一开始是明确分配的,而您没有给它分配任何值
  • 输出参数一开始是明确分配的,您必须确保任何时候返回(无一例外)它明确分配

所以:

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

【讨论】:

  • 真正有趣的是 CLR 没有 ref 的概念。这是一个 c# 语义。
  • 你不是说CLR懂ref但不out吗?
  • (无论如何,我认为是这种情况 - C# 编译器只是为 out 方法添加 [Out] 属性,并进行适当的检查,但否则它只是一个 ref 参数。)
  • @Jon,呵呵!是的,你是正确的。我倒过来了
  • 谢天谢地。我的全部知识、身份、灵魂和存在都源于这个事实。我在边缘颤抖......(虽然说真的,我会感到惊讶和轻微不安。)
【解决方案2】:

最简洁的查看方式:

ref = inout

out = out

【讨论】:

  • 不是我见过的最好的解释,tbh
  • 但它是最简洁的,这是要求的。
  • 虽然简明扼要,但也极其欠缺。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    来源: MSDN

    【讨论】:

      【解决方案5】:

      来自 Alex 提到的 MSDN 文章,

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

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

      总而言之,在方法内部你可以考虑设置 ref 参数,但不能考虑设置 out 参数——你必须设置这些。 在方法之外,它们的行为应该相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2012-08-07
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        相关资源
        最近更新 更多