C#使用IF / ELSE语句中Method的返回值

时间:2016-11-28 14:43:51

标签: c# .net if-statement syntax

现在我正在制作一个简单的程序,这是我多次思考过的问题。很多次我运行我的方法两次是因为在运行它们之前检查返回值,我想知道是否有一种方法可以防止这种情况,比如使用我正在检查的方法返回的值。这很难解释,所以这是我程序中的一个真实例子。

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;
        }
    }

}

3 个答案:

答案 0 :(得分:6)

您可以将其简化为以下代码,这些代码只调用一次这些方法并使代码更具可读性:

Dim thisDict As New Dictionary(Of String, String)

 Public Sub listviewupdate(ByVal D As Dictionary(Of String, String))
    ListView1.Items.Clear()
    For Each KVP As KeyValuePair(Of String, String) In D
        Dim LVI As New ListViewItem(KVP.Key)
        LVI.SubItems.Add(KVP.Value)
        ListView1.Items.Add(LVI)
    Next
End Sub

 Private Sub rbChoiceA_Checked(ByVal sender As Object, ByVal e As EventArgs)
    Dim rbA As RadioButton = TryCast(sender, RadioButton)
    Dim str As String = rbA.Parent.Name.Remove(0, 6)
    lblItemNo.Text = str
    If thisDict.ContainsKey(str) Then thisDict.Remove(str)
    thisDict.Add(str, rbA.Text)
    listviewupdate(thisDict)
End Sub

解释为什么这有效 - ??运算符(null-coalescing运算符!)基本上表示"如果返回的值在??的左侧?为null,然后返回右侧的表达式的值"。

这样您只需要调用一次函数。

答案 1 :(得分: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

答案 2 :(得分:-1)

在我看来你可能正在使用一个临时变量来保存结果,你可以测试并返回。

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

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

这是一种常见的范例,特别是当被调用的方法很昂贵和/或有副作用时,你不希望发生两次。

这里," var"声明设置"结果"的类型到被调用方法返回的类型;你也可以使用实际类型的名称。

如果您希望进行两种不同类型的测试,除非它们具有相同的类型(在这种情况下看起来像是这样),否则您需要两个不同的变量。

另一种需要完整类型的机制,您也会看到:

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;

在这里,你明确地声明了返回值的类型,然后进行了你已经指示的两个调用,测试结果为null,并返回第一个非空值。