3

簡潔な説明はありますか?

また答えられた:.NETのrefパラメータとoutパラメータの違い


6 답변


19

発信者のために:

  • 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には参考文献という概念がありません。これはc#の意味です。 - JaredPar
  • CLRがrefを理解しているが理解していないという意味ではありませんか。 - Jon Skeet
  • (とにかく、C#コンパイラはoutメソッドに[Out]属性を追加して適切なチェックを行うだけだと思いましたが、それ以外はrefパラメータにすぎないと考えました。) - Jon Skeet
  • @ジョン、doh!はい、あなたは正しいです。私は後方にそれを持っています - JaredPar
  • よろしくお願いします。私の知識、アイデンティティ、魂、そして存在の全ては、その事実から導かれています。私は瀬戸際に震えていました...(まじめにも、私は驚いたし、少し邪魔されていたでしょう。) - Jon Skeet

3

それを表示するための最も簡潔な方法:

ref = inout

out = out


  • 見たことがない最高の説明文、TBB - Andrew Bullock
  • しかし、それは最も簡潔であり、それが求められたものです。 - Binary Worrier
  • 簡潔かもしれませんが、それも非常に不足しています。 - Mike Christiansen

2

見るこのMSDNの記事。どちらも微妙に異なることを達成しています。


1

refおよびoutパラメータ渡しモードは、メソッドが呼び出し元によって渡された変数を変更できるようにするために使用されます。 refとoutの違いは微妙ですが重要です。各パラメータ受け渡しモードは、わずかに異なるプログラミングシナリオに適用するように設計されています。 outパラメータとrefパラメータの重要な違いは、それぞれによって使用される明確な割り当て規則です。

outパラメータを受け取るメソッドの呼び出し元は、呼び出しの前にoutパラメータとして渡された変数に割り当てる必要はありません。ただし、呼び出し先は戻る前にoutパラメーターに割り当てる必要があります。

ソース:MSDN


1

Alexが述べているMSDNの記事から、

outパラメータを受け取るメソッドの呼び出し元は、呼び出しの前にoutパラメータとして渡された変数に割り当てる必要はありません。ただし、呼び出し先は戻る前にoutパラメーターに割り当てる必要があります。

対照的に、refパラメータは、着呼側によって最初に割り当てられたと見なされる。そのため、呼び出し先は使用前にrefパラメータに割り当てる必要はありません。

要約すると、メソッド内ではrefパラメータが設定されていると見なすことができますが、outパラメータは設定できません - これらを設定する必要があります。 メソッドの外側でも同じように動作するはずです。


0

このJon Skeetの記事でc#のパラメータについて調べてください。

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

リンクされた質問


関連する質問

最近の質問