1

C# 関数に出力パラメーターがある場合は、次のように明確にします。

private void f(out OutputParameterClass outputParameter);

これは、関数が呼び出されたときにパラメーターを初期化する必要がないことを示しています。ただし、この関数を呼び出すときは、out キーワードを繰り返す必要があります

f(out outputParameter);

これは何に良いのか気になります。関数仕様の一部を繰り返す必要があるのはなぜですか? 誰か知っていますか?

4

8 に答える 8

27

これは、自分が何をしているのかを知っていることを意味します。つまり、それがoutパラメーターであることを認めているということです。まったく異なる動作が静かに行われることを本当に望んでいますか? ちなみに、も同じですref

(by-value と out/ref に基づいてオーバーロードすることもできますが、お勧めしません。)

基本的に、(キャプチャされていない) ローカル変数を取得し、それを out/ref 以外の引数として使用すると、その変数の値がメソッド内で変更されないことがわかります。(参照型変数の場合、それが参照するオブジェクト内のデータは変更される可能性がありますが、それは非常に異なります。)

これにより、C++ で無意識のうちに何かを参照渡しするような状況を回避できますが、値が変更されていないと仮定します...

于 2009-09-08T13:14:32.397 に答える
3

設計上の特徴です。必要がないことは明らかですが、読みやすくするのに役立ちます。

于 2009-09-08T13:13:55.393 に答える
2

読みやすくするために、メソッドが変数に対してできる/行うことを知っています。

MSDN から詳細情報を取得: http://msdn.microsoft.com/en-us/vcsharp/aa336814.aspx

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

于 2009-09-08T13:27:57.407 に答える
2

そのような決定の起源はわかりませんが、オーバーロードする目的があることは知っています。

これら 2 つの関数を同じクラスで作成することは完全に合法です。

private void f(out OutputParameterClass outputParameter);

private void f(OutputParameterClass outputParameter);

outこのようなオーバーロードを呼び出すときにキーワードを指定することは理にかなっています。

于 2009-09-08T13:15:12.490 に答える
1

一貫性と明快さの問題だと思います。

明らかに、コンパイラはなくてもうまくいく可能性があります。ただし、out キーワードを追加すると、意図が明確になり、コードがより明確になり、読みやすくなります。

于 2009-09-08T13:15:18.030 に答える
1

私が見ることができる唯一の理由は、このパラメーターの値が関数によって変更できることを関数のユーザーが知っていることを確認することです。いいことだと思います。

于 2009-09-08T13:14:58.030 に答える
-1

私が得た最良の答えは、台座によるコメントとして投稿されました:

out / refが繰り返される最も重要な理由は、呼び出している関数が別のシグニチャーでリファクタリングされると、コンパイルエラーが発生することです。最も注目すべきは、パラメーターが非アウトからアウトに変化した場合、すぐにわかることです。

于 2009-11-16T10:50:37.413 に答える
-2

おそらくout明確にするために使用する必要があります。メソッドのシグネチャを見ないとわからない場合。

于 2009-09-08T13:12:28.797 に答える