2

void署名は、メソッドが何も返さないことを示すために使用されるため、そのような種類のメソッドは、次のように記述します。

private void MyMethod()
{
    // Body of the method.
}

ただし、多くの場所で、次のように記述された、何も返すことを意図していないメソッドを見てきました。

private object MyMethod()
{
    // Body of the method

    return null;
}

私の観点からは、両方のコード部分が同じことを行います。では、この 2 番目のものを使用する目的はどれでしょうか? それらの違いはどれですか?そして、それらのいずれかが他のものよりも優先されますか?

4

8 に答える 8

7

単一の戻り値でそのまま記述された 2 番目のものは、一般に役に立たず、パフォーマンスがわずかに低下し、API の使用が難しくなります。ただし、次のように役立つ可能性のあるわずかなバリエーションがあります。

  • 複数のリターン ポイントがあり、これがオブジェクトの欠如を示す最後のポイントです。たとえば、通常はオブジェクトのインスタンスを返すことがありますが、何らかの理由で今回はインスタンスがありません。(例1)

  • メソッドが別の方法でマークされている場合、たとえばpublic virtual、デフォルトの実装またはオーバーライドされた実装は値を返さない可能性がありますが、他の実装は値を返す可能性があります。(例2)

例 1:

public object MyMethod()
{
   if(myObj != null)
      return myObj.Result();

   return null;
}

例 2:

// Derived Class
protected override object MyMethod()
{
    // We don't need a result from here so we don't have an implementation of
    // anything, but the base implementation doesn't make sense. This however
    // could be breaking SOLID principles.
    return null;
}

// Base Class
protected virtual object MyMethod()
{
    return new MyObj();
}
于 2013-06-18T08:31:15.033 に答える
1

おそらく2番目は例外処理を呼び出すために使用できます

于 2013-06-18T08:33:01.077 に答える
0

null2 番目のものを使用すると、何らかの理由で例外をスローすることが望ましくない場合、呼び出し元は成功または失敗の有用な指標であるネスをテストできます。最初のものでは、そのような機能は利用できません。

于 2013-06-18T08:29:45.213 に答える
0

2番目は誤解を招くものです。あなたのクラスを使用する人は、このメソッドを実行した後に何かを得ることを期待します。どのような状況でも意味のある値を返すつもりがない場合は、そのようなメソッドを作成しないでください。

意味のあるものを返すクラスをオーバーライドする場合でも、既存の API を壊さずにLSPに従うように、 NullObjectデザイン パターンの使用を検討する必要があります。null を返すと、追加の null チェック ロジックで冗長性が生まれ、直感に反します。

于 2013-06-18T08:29:46.480 に答える
0

2 つ目は悪い習慣です。戻り値の型をチェックするようにコンパイラに指示する必要はありません。たぶん、将来の変更のために行われます。

于 2013-06-18T08:31:39.783 に答える
0

2 つ目は、メソッド本体に他の戻り値がなければ意味がありません。メソッドが値を返さないことを保証する限り、最初のものを使用してください。

于 2013-06-18T08:33:44.677 に答える
0

2番目のメソッド自体がnullの場合に何かを返します。値を返さないメソッドとは感じません。メソッドが返されない場合は、void で練習することをお勧めします

于 2013-06-18T08:34:34.023 に答える
0

メソッドが呼び出しと引数を正常に受信したかどうか、またはメソッドが内部のロジックを正常に実行したかどうかを確認するために、毎回 bool 値を返すことをお勧めします。

a を返すのNULLは役に立たず、誤解を招きます...

于 2013-06-18T08:34:52.660 に答える