C#メソッドでの戻り変数の宣言と直接値を返す


16

戻り変数に関する議論では、チームの一部のメンバーは、呼び出し元に結果を直接返すメソッドを好む一方、他のメンバーは、呼び出し元に返される戻り変数を宣言することを好みます(以下のコード例を参照)

後者の引数は、コードをデバッグしている開発者が、呼び出し元に戻る前にメソッドの戻り値を見つけることができるため、コードが理解しやすくなることです。これは、メソッド呼び出しがデイジーチェーン接続されている場合に特に当てはまります。

どちらが最も効率的であるか、および/または、あるスタイルを別のスタイルよりも採用する必要があるという理由はありますか?

ありがとう

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
両方の例は、同一のILにコンパイルされます。2番目の例が必要な唯一の理由は、デバッグのため、またはresult返す前に使用する必要がある場合です。
ChrisF

1
もう1つの理由は、結果を計算してから返すまでの間に別の操作を行う必要があるためです。
-tdammers

1
@ChrisF、実際には彼らは私のために同じILにコンパイルしません(追加がstloc.0ありldloc.0、第2バージョンにあります)。しかし、それはデバッグモードでのみ起こると思います。とにかくここではあまり重要ではありません。
-svick

@svick-OK-「リリースモード」で追加する必要がありました;)
ChrisF

1
:あなたは、時には(簡潔にするために)書き込み何かに見えるようにその必要がありますすることができ以来a = b = c;a == b == c、私はのようになっていることを何か書い回避するa = b == cことができます場合に。そのようなコード行を初めて見たとき、何が起こっているのかを理解するのに数秒かかりました。そのコードは際立っていました。かっこをa == 3たたきたいのですが、StyleCopはそれを好みません。これは、バージョン番号1を使用する正当な理由です。他の何か:これは本質的にのようなラムダa => (a == 3)です。すでに肥大化した単純な関数にコード行を追加するのはなぜですか?
ジョブ

回答:


7

私はVisual StudioでResharperを使用しているため、Ctrl-RV(またはResharper / IntelliJキーバインディングを使用する場合はCtrl-Alt-V)を使用して、最初の例を2番目の例に変えます。したがって、デバッグしたいときは、それを十分簡単に​​実行できます。それを元に戻すのを忘れたとしても、Ctrl-RIが再び元に戻して読みやすくするので、気分が悪くなることはありません。

真剣に、より重要なことについて議論するあなたの時間を無駄にします。主要なブレースまたはスペースとタブを配置する場所が好きです。


5
私の議論は目に見えないキャラクターについてであることが好きです
...-ChaosPandion

素晴らしいヒント、みんな!これで、以前よりもはるかに迅速に互いのコードを継続的にリファクタリングできます。実際に議論するよりも時間を節約できるでしょう。:)
pb01

@pdrはそのctrl + RVがresharperでのみ動作しますか?それとも、何らかのカスタムキーバインドですか?私にはうまくいきません。
ジェーンドー

@JaneDoe:それはResharperリファクタリングであり、VSには同等のものがないことを知ってfind然としました。回答が修正されました。ごめんなさい
-pdr

@ChaosPandion U + 200Bが勝ちました!
ジェシーC.スライサー

18

個人的には、最初の例を読みやすくしています。returnステートメントにブレークポイントを設定a == 2してウォッチウィンドウに追加するか、クイックウォッチを使用することで、引き続きデバッグできます。

しかし、これは本当に個人的な好みの問題です。どちらのバージョンでも問題ありません。


8
+1は楽に間違った方法ラウンド私見やっているブレークポイントを配置するためにコードを読み取ることが困難立ち直り
JKを。

式がスレッドの実行を必要とする場合があるため、ウォッチウィンドウまたは中間ウィンドウは常にこの問題の解決策ではありません。
JustAnotherUserYouMayKnowOrNot

@JustAnotherUserYouMayKnowOrNot:はい。ブレークポイント内からデバッグウィンドウにメッセージを出力することもできます。ブレークポイントを右クリックして、「ヒット時...」を選択します。
オリビエジャコット-デスコンブ

また、式には副作用があり、再度実行すると問題が発生する可能性があります。結果変数に固執します。
JustAnotherUserYouMayKnowOrNot

9

コードが例のように簡単に読める場合、などの論理演算の結果を返すことに問題はありませんreturn a == 2。ただし、戻り値がより複雑なステートメントである場合、または次のように見える場合

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

次に、変数を使用してその一部を最初に格納し、読みやすくするためにreturnステートメントを単純化します。


2

そのような単純な例では、どちらでも構いません。

より複雑な例については、2番目の方法を好みます。それはより読みやすく、他の人がコードを維持する必要があるためです。


resultそれ自体が完全に説明的で役に立たない識別子であるよりも優れた変数名がある場合のみ。
アレクサンダー-モニカの復活
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.