2016-11-28 10 views
0

今は簡単なプログラムを作成していますが、これは何度も考えてきた問題です。多くの場合、実行する前に戻り値をチェックするためにメソッドを2回実行しますが、これを防ぐ方法があるかどうかを知りたいと思います。説明するのは非常に難しいので、私のプログラムの実際の例がここにあります。C#IF/ELSEステートメントでMethodの戻り値を使用

public class SFDBRepository 
{ 
    public static Domain.SF.SFObject GetSFOrder(string WorkOrd) 
    { 
     //As you can see here i'm checking on the output of this method, before trying to return it. 
     if (Domain.SF.SF.GetOrder(WorkOrd) != null) 
     { 
      //If the value is not null (My method returns null if no result), return the object 
      return Domain.SF.SF.GetOrder(WorkOrd); 
     } 
     //Same thing happens here. My method runs twice every time almost. 
     else if(Domain.Building_DeliveryPerformance.Building_DeliveryPerformance.GetObject(WorkOrd) != null) 
     { 
      return Domain.Building_DeliveryPerformance.Building_DeliveryPerformance.GetObject(WorkOrd); 
     } 
     else 
     { 
      return null; 
     } 
    } 

} 
+0

戻り値を変数に取り込み、それ以降は変数を使用します: 'var result = Domain.ShopFloor.Shopfloor.GetOrder(WorkOrd)... if(result!= null)return result;' –

+1

また、 ['using'ディレクティブ](https://msdn.microsoft.com/en-us/library/sf0df423.aspx)を使用して、コード内で名前空間パス全体を繰り返し使用する必要はありません。また、ベストプラクティスは、クラスに名前空間があるのと同じ名前を付けることではありません。 – juharr

答えて

0
public static Domain.ShopFloor.ShopFloorObject GetShopFloorOrder(string WorkOrd) 
{ 
    //As you can see here i'm checking on the output of this method, before trying to return it. 
    Domain.ShopFloor.ShopFloorObject wo = Domain.ShopFloor.Shopfloor.GetOrder(WorkOrd); 
    if (wo != null) 
    { 
     //If the value is not null (My method returns null if no result), return the object 
     return wo; 
    } 
    //Same thing happens here. My method runs twice every time almost. 
    Domain.ShopFloor.ShopFloorObject yowo = Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(WorkOrd); 
    if(yowo != null) 
    { 
     return yowo; 
    } 

    /* default return */ 
    return null; 

} 

PS

あなたはちょっと "ファクトリパターン"

、あなたが次のコードにこれをダウン簡素化することができ

http://www.dofactory.com/net/factory-method-design-pattern

+1

"else if"ステートメントの前にあるコード行を入れていますが、中括弧の外側にあるコード行を入れているため、このコードはコンパイルされません。最初の "if"ブランチの本体... –

+3

最後の2つの節は冗長です。ヌルでない場合はnullを返し、ヌルの場合はnullを返します。ゼロとは無関係に、単純に「返す」とはどのように違いますか? –

+1

最初のテストはtrueなら元のコードもこれもelse if'も必要ありません。@EricLippertが指摘しているように、後半部分全体を 'return Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(WorkOrd); 'に置き換えることができます。 – TripeHound

6

を参照してくださいをやっていますこれらのメソッドを一度呼び出すだけで、コードをはるかに読みやすくなります:

public class ShopFloorDBRepository 
{ 
    public static Domain.ShopFloor.ShopFloorObject GetShopFloorOrder(string workOrd) 
    { 
     return Domain.ShopFloor.Shopfloor.GetOrder(workOrd) ?? 
       Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(workOrd); 
    } 
} 

これがなぜ機能するのかを説明する - ??演算子(nu​​ll-coalescing演算子!)は、基本的に "??の左側の戻り値がNULLの場合は、式の値を右側に戻します"と表示します。

この方法で、関数を一度呼び出すだけで済みます。

+0

明らかに質問者はC#には比較的新しいので、あなたがここで何をしているのかの簡単な説明は?明示的なnullを返す必要がない理由がおそらく助けになるでしょう。 – PaulG

+0

@PaulGは、null結合演算子の使用法を説明するために答えを更新しました –

-1

一時変数を使用して結果を保持できるように見えますが、これをテストして戻すことができます。

public class ShopFloorDBRepository 
{ 
    public static Domain.ShopFloor.ShopFloorObject GetShopFloorOrder(string WorkOrd) 
    { 
    var result = Domain.ShopFloor.GetOrder(WorkOrd); 

    if (result != null) return result; 
    ... 

これは、呼び出されるメソッドが高価であるおよび/またはあなたが二回負担したくない副作用を持っている場合は特に、一般的なパラダイムです。

ここで、 "var"宣言は、 "result"の型を、呼び出されるメソッドによって返される型に設定します。実際のタイプの名前を使用することもできます。

このように2種類のテストを行う場合は、同じタイプ(この場合は同じように見える)でない限り、2つの異なる変数が必要です。

public static ShopFloorObject GetShopFloorOrder(string WorkOrd) 
{ 
    ShopFloorObject result; 

    if ((result = Domain.ShopFloor.GetOrder(WorkOrd)) != null) 
     return result; 
    if ((result = Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(WorkOrd)) != null) 
     return result; 
    return null; 

をここでは明示的に示されてきた2つの呼び出しを行った後、戻り値の型を宣言している:あなたも参照してくださいよということ

フルタイプを必要としない代替メカニズム、結果をヌルでテストし、最初の非ヌル値を戻します。

関連する問題