2011-11-21 5 views
9

をしています:ベストプラクティス:refパラメータまたは戻り値?次のように実際に私が参照パラメータとしてリストを

public static List ListMethod(List result) 

私は何人かの人々があまりにもこの方法でやって見ました:私は間違っていないよ場合は、「私」の方法、

public static void ListMethod(ref List result) 

を参照パラメータとしてlistが使用され、彼のメソッドでは「他の」と同じ方法で使用することができます。

しかし、あなたがパラメータを入力して何かをして、メソッドの戻り値に返すということは、私にとってもっとクリーンなようです。

いずれかの方法または他の方法に対する良い引数はありますか?

+0

これは一覧ですか?あなたが達成しようとしていることは何ですか? –

+3

outをref/outとして渡すと、内部的にヒープコピーを指す参照がスタックで作成され、それが呼び出し先メソッドに渡されます。 refを使用すると、引き渡し引数として同じ参照が使用されます。 – Zenwalker

+1

最初のメソッドで 'List'を返す必要があり、2番目のメソッドで何も返さないのはなぜですか? – BoltClock

答えて

30

それはあなたがrefを使用する必要はありませんそうだ - しかし差があります。

通常、リファレンスタイプのパラメータにrefを使用している人が表示されるのは、パラメータの受け渡しの仕組みがわからないからです。あなたの方法はこのような何かがあるなら:

result = new List(); 
... 

を第二の場合には、発信者の変数は、新しいオブジェクトを参照するように変更されます、一方、その後、最初のケースでは、呼び出し側は、変更は表示されません。

もっと詳しくは私のarticle on parameter passingをご覧ください。

+0

ありがとうございました。 'Jon Skeet' – Dotnet

3

リストを返すだけの場合は、常にその意図を示す最初のものを使用する必要があります。

refのバージョンでは、リストから始めることができ、送信したリストを変更したり、別のもので変更することもできます。それがあなたの意図なら、それをしてください。

しかし、メソッドが常に新しいリストを返す場合は、refパラメータの代わりに戻り値を使用します。

に関する注意:あなたは、新しいリストを返すあなたの意図を示すために、代わりにrefoutを使用することができますが、何か他の戻り値を使用している場合にのみお勧めします。

11

いいえ、お使いの方法ではrefパラメータは使用されません。デフォルトはpass by valueです。

違いは、あなたのメソッドはあなたのリストの内容を変更するだけで、パラメータresultが指すリファレンスは変更できないということです。

ベストセラーアプローチは何ですか?あなたの方法が何をすべきかによって異なります。

メソッドがリストを変更するか、新しいデータを返すときは、戻り値を使用する必要があります。 refパラメータを使うよりも、コードが何をするかを理解する方がはるかに優れています。

戻り値の別の利点は、メソッド連鎖を使用できることです。

あなたは別の方法からリストパラメータを渡し、このようなコードを書くことができます:ここに参照パラメータに関する特別

ListMethod1(list).ListMethod2(list)... 
+3

+1メソッド連鎖を行う能力があります。もしあなたが本当にしたいのであれば、パラメータを変更することもできます。 'return result;'はLOC、CPU、または複雑さの点であまり高価ではなく、関数消費者の生活をもっと簡単にすることができます。 –

1

ことの一つは、ということです - REFで渡された変数が第1の値を割り当てる必要があります」。 "ですから、呼び出しの前に値を代入するために呼び出し側のメソッドに対して厳密にしたいのであれば、おそらくrefパラメータを使うことができます。

関連する問題