2016-11-28 1 views
0

Im Moment arbeite ich an einem einfachen Programm, und das ist ein Problem, über das ich viele Male nachgedacht habe. Oftmals führe ich meine Methoden zweimal aus, weil ich den Rückgabewert überprüft habe, bevor sie ausgeführt werden, und ich würde gerne wissen, ob es einen Weg gibt, wie ich das verhindern kann, wie den zurückgegebenen Wert der Methode, gegen die ich mich wende. Es ist ziemlich schwer zu erklären, hier ist ein Beispiel aus meinem Programm.C# Verwendet zurückgegebenen Wert von Methode in IF/ELSE-Anweisung

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

Capture den Rückgabewert in eine Variable, verwenden Sie die Variable danach: 'var result = Domain.ShopFloor.Shopfloor.GetOrder (WorkOrd) ... if (Ergebnis! = Null) Ergebnis zurückgeben;' –

+1

Sie sollten auch die ['using' Direktive] (https://msdn.microsoft.com/en-us/library/sf0df423.aspx), damit Sie die gesamten Namespace-Pfade nicht wiederholt in Ihrem Code verwenden müssen. Es empfiehlt sich auch, die Klassen nicht so zu benennen, wie der Namespace, in dem sie sich befinden. – juharr

Antwort

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

Sie irgendwie die "Fabrik-Muster"

Siehe

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

+1

Dieser Code wird nicht einmal kompiliert, weil Sie eine Codezeile vor die else if-Anweisung gesetzt haben, aber außerhalb der geschweiften Klammern von der Körper des ersten "Wenn" -zweigs ... –

+3

Die letzten beiden Klauseln sind redundant: Sie haben, wenn es nicht null ist, geben Sie es zurück, wenn es null ist, geben Sie null zurück. Wie ist das anders als einfach "es zurückgeben", unabhängig von seiner Nichtigkeit? –

+1

Weil der erste Test zurückgibt, wenn wahr, weder der ursprüngliche Code noch das braucht 'else if' ...und wie @EricLippert darauf hinweist, könnte die gesamte zweite Hälfte einfach durch 'return Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject (WorkOrd) ersetzt werden;' – TripeHound

6

tun können Sie dies mit dem folgenden Code vereinfachen gelegt, die Diese Methoden werden nur einmal aufgerufen und machen den Code deutlich lesbarer:

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

Um zu erklären, warum das funktioniert - die ?? Operator (der Nullkoaleszenzoperator!) sagt grundsätzlich "Wenn der zurückgegebene Wert auf der linken Seite des ?? ist Null, dann gebe den Wert des Ausdrucks auf der rechten Seite zurück".

Auf diese Weise müssen Sie nur einmal Ihre Funktionen aufrufen.

+0

Offensichtlich ist der Fragesteller relativ neu in C#, also eine kurze Beschreibung dessen, was Sie hier mit der ?? Operator, und warum es nicht notwendig ist, eine explizite Null zurückzugeben, würde wahrscheinlich auch helfen. – PaulG

+0

@PaulG hat die Antwort aktualisiert, um die Verwendung des Nullkoaleszenzoperators zu erklären –

-1

Sieht für mich aus, als könnten Sie eine temporäre Variable verwenden, um das Ergebnis zu halten, das Sie testen und zurückgeben können.

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

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

Dies ist ein gemeinsames Paradigma, vor allem, wenn das Verfahren ist teuer genannt und/oder hat Nebenwirkungen Sie zweimal nehmen sich nicht wünschen.

Hier legt die "var" -Deklaration den Typ von "result" auf den Typ fest, der von der aufgerufenen Methode zurückgegeben wird; Sie könnten auch den Namen des tatsächlichen Typs verwenden.

Wenn Sie zwei verschiedene Arten von Tests machen möchten, benötigen Sie zwei verschiedene Variablen, es sei denn, sie haben denselben Typ (was in diesem Fall der Fall ist).

Ein alternativer Mechanismus, der die volle Art erfordert, dass Sie auch sehen:

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; 

Hier sind Sie explizit den Typ des Rückgabewert deklarieren, dann machen die beiden Anrufe, die Sie angegeben haben , Testen der Ergebnisse gegen null und Zurückgeben des ersten Nicht-Null-Werts.

Verwandte Themen