発信者のために:
メソッドの場合:
そう:
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
refおよびoutパラメータ渡しモードは、メソッドが呼び出し元によって渡された変数を変更できるようにするために使用されます。 refとoutの違いは微妙ですが重要です。各パラメータ受け渡しモードは、わずかに異なるプログラミングシナリオに適用するように設計されています。 outパラメータとrefパラメータの重要な違いは、それぞれによって使用される明確な割り当て規則です。
outパラメータを受け取るメソッドの呼び出し元は、呼び出しの前にoutパラメータとして渡された変数に割り当てる必要はありません。ただし、呼び出し先は戻る前にoutパラメーターに割り当てる必要があります。
ソース:MSDN
Alexが述べているMSDNの記事から、
outパラメータを受け取るメソッドの呼び出し元は、呼び出しの前にoutパラメータとして渡された変数に割り当てる必要はありません。ただし、呼び出し先は戻る前にoutパラメーターに割り当てる必要があります。
対照的に、refパラメータは、着呼側によって最初に割り当てられたと見なされる。そのため、呼び出し先は使用前にrefパラメータに割り当てる必要はありません。
要約すると、メソッド内ではrefパラメータが設定されていると見なすことができますが、outパラメータは設定できません - これらを設定する必要があります。 メソッドの外側でも同じように動作するはずです。