私が知る限り、out
パラメーターの唯一の用途は、呼び出し元が単一のメソッド呼び出しから複数の戻り値を取得できることです。ref
ただし、代わりにパラメーターを使用して複数の結果値を取得することもできます。
では、パラメーターが有用であることが証明され、代わりにパラメーターをout
使用できない状況は他にありますか?ref
ありがとうございました。
私が知る限り、out
パラメーターの唯一の用途は、呼び出し元が単一のメソッド呼び出しから複数の戻り値を取得できることです。ref
ただし、代わりにパラメーターを使用して複数の結果値を取得することもできます。
では、パラメーターが有用であることが証明され、代わりにパラメーターをout
使用できない状況は他にありますか?ref
ありがとうございました。
ref
はい-との違いはout
、明確な割り当てに関するものです。
メソッド呼び出しの前に、呼び出し元がパラメーターを明確に割り当てる必要はout
ありません。正常に戻る前に(つまり、例外なく)、メソッドで確実に割り当てる必要があります。変数は、呼び出し後に呼び出し元に確実に割り当てられます。
メソッドを呼び出す前に、呼び出し元がパラメーターを確実に割り当てる必要がありref
ます。メソッドで別の値を割り当てる必要はありません。
したがって、代わりint.TryParse(string, out int)
に使用するように変更したいとします。ref
通常、呼び出し元のコードは次のようになります。
int value;
if (int.TryParse(text, out value))
{
// Use value
}
else
{
// Do something else
}
ここで、を使用した場合、呼び出しの前に値を指定する必要があります。例ref
:value
int value = 0;
if (int.TryParse(text, ref value))
{
// Use value
}
else
{
// Do something else
}
明らかにそれは大きな違いではありませんが、間違った印象を与えます。これまで使用するつもりのない値を割り当てているので、読みやすさには良くありません。out
パラメータは、値がメソッドから出力されること(例外がないと仮定)、および最初から値を持っている必要がないことを示します。
私がC#5に対して行った提案の1つ(取り上げられるかどうかはわかりません)は、out
パラメーターを持つメソッドは、値のタプルを返すメソッドと見なすことができるはずであるというものです。タプルのより良いサポートと組み合わせると、次のようなことができるようになります。
var (ok, value) = int.TryParse(text);
この場合ok
、とvalue
はそれぞれに暗黙的に入力されbool
ますint
。そうすれば、メソッドに何が入っているのか(text
)と何が出てくるのか(2つの情報:ok
とvalue
)が明確になります。
代わりにパラメーターをint.TryParse
使用した場合、これは単純に利用できません。コンパイラーは、パラメーターの初期値を実際に気にするかどうかを知ることができないためです。ref
ref
パラメータは次のように見ることができます。
通常のパラメーターはパラメーター内にあります。
値は、そのようなパラメーターを介して関数に入ることができます。したがって、初期化する必要があります。
ref
パラメーターは入出力パラメーターです
。値は、そのようなパラメーターを介して関数に出入りできます。前者のため、初期化も必要です。
out
パラメーターは出力パラメーターです
。値は、そのようなパラメーターを介して関数から返されることのみが想定されています。したがって、初期化する必要はありません。
ref
/out
パラメータのこのような見方は、Microsoft の COM テクノロジを研究して思いつきました。IDL (インターフェース記述言語) は、COM コンポーネントのインターフェースを記述するために使用され、IDL では、パラメーターはin
、out
、およびinout
宣言子で拡張されます。.NET と C# は、これらの宣言子を COM から部分的に継承していると思われますが、名前は (ref
ではなくinout
) わずかに異なります。
COM ではout
、インターフェイス メソッドの実際の戻り値を取得するためにパラメーターが頻繁に使用されます。これは、"実際の" 戻り値がHRESULT
成功/エラー コードを返すために既に使用されていることが多いためです。
out
.NET では、メソッドから複数の値を返したい場合でも、パラメーターの重要性ははるかに低いと思います (Tuple
これらの状況では複雑なオブジェクトまたは s を返すことができます)。
1つの重要な違いはこれです:
out引数として渡される変数は、初期化する必要はありません。ただし、メソッドが戻る前に、outパラメーターに値を割り当てる必要があります。
(refパラメーターはこれを必要としません)
ソース: http: //msdn.microsoft.com/en-us/library/t3c3bfhx (VS.71).aspx
out
パラメータは、メソッドから複数の結果値が必要な場合に役立ちます。技術的には、パラメーターを使用ref
して同じ目標を達成することもできますが、パラメーターを使用out
した方が意図を伝えるのにはるかに優れています。を使用する場合、関数の結果を使用する代わりに、または代わりに使用するref
理由が明確ではありません。out
おそらく、渡された値を変更するつもりですが、なぜそれを変更しているのかは、関数のシグネチャだけでは明らかではありません。
良い例は int.TryParse() だと思います
http://msdn.microsoft.com/en-us/library/f02979c7.aspx
outがrefよりも優れている主な理由は、呼び出す前に (暗黙的であっても) ダミー値を return var に割り当てる必要がないことです。
したがって、 outはあなたとコンパイラーに次のように伝えます。
2 つの主な違いは、refを使用している場合、呼び出しの前にこれを初期化する必要があり、メソッドでref変数に値を割り当てることはオプションであるということです。
ただし、outメソッドの場合、それらを明示的に初期化する必要はありませんが、メソッドでは何らかの値を代入する必要があります。そうしないと、コンパイル時エラーが発生します。