消除回归功能

时间:2009-06-24 08:23:29

标签: c#

如何消除一个语句的多个return语句。例如:我有一个if子句,if子句的结果为true,它将返回0.或返回1,如果包含另一个if子句则相同的else。它还有返回值。我怎样才能将这四个回复陈述归为一个?

这是程序

if (IgC == true)
        {
            if (val1.ToUpper() == val2.ToUpper())
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }

        else
        {
            if (val1 == val2)
            {
                return 0;
            }

            else
            {
                return 1;
            }
        }

15 个答案:

答案 0 :(得分:7)

这是我对逻辑的猜测......

int retVal;

if (condition) 
{
  // statements
  retVal = 0;
}
else 
{
  // statements
  if (otherCondition)
  {
    retVal = 1;
  }
  else
  {
    retVal = 2;
  }
}

return retVal;

以及您现在发布的更新:

int retVal;

if (IgC)
   retVal = (val1.ToUpper() == val2.ToUpper()) ? 0 : 1;
else
   retVal = (val1 == val2) ? 0 : 1;

return retVal;

我避免嵌套三元运算符或用它们检查多个条件,因为这会使代码模糊不清。如果你更明确的话,那并不是代码的效率会降低,所以整个事情只是关于可读性。

我尝试权衡代码长度和视觉复杂性与表现力,而if / ternary组合对我来说似乎是一个很好的中间立场。

答案 1 :(得分:3)

另一种方法是使用三元运算符(?:)

return (IgC && val1.ToUpper() == val2.ToUpper()) || (!IgC && val1==val2) ? 0 : 1;

它的工作原理如下:

return condition_to_check ? result_if_true : result_if_false;

答案 2 :(得分:3)

一般性评论 - 因为我得到的印象是,原始问题更多的是关于消除多个回报,而不是关于发布的具体示例。

在我看来,应该通过使代码清晰易读来驱动函数有多少退出点的决定。在给出的示例中,我会说保持原样(带有多个返回)导致最清晰的代码。正如其他评论者指出的那样,您可以在多个位置设置“结果变量”并直接转到单个返回,但这样做真的使代码更容易理解。我会说它在这个例子中不是

我见过教科书说所有函数必须只有一个退出点,我想知道这是否是推动这个问题的原因。虽然这个规则在学术意义上可能是可取的,但我不认为它在真实代码的现实世界中运作良好。

合并退出点的一个很好的理由是,你需要在函数的主逻辑之后和函数退出之前执行某些“尾部”代码。在这种情况下,使用'结果变量'和单个return语句是有意义的。

Theres没有绝对正确的答案。关于判断。

安迪

答案 3 :(得分:1)

在这种情况下,将返回值设置为变量而不是使用返回值,并在结尾处返回变量值。

正如保罗亚历山大所说,其他案件可能需要不同的方法。

答案 4 :(得分:1)

我想我会这样做:

bool areEqual = IgC ? val1.Equals(val2, StringComparison.InvariantCultureIgnoreCase): val1.Equals(val2, StringComparison.InvariantCulture);
return areEqual ? 0 : 1;

......或(可能)提高可读性:

bool areEqual;
if (IgC)
{
    areEqual = val1.Equals(val2, StringComparison.InvariantCultureIgnoreCase);
}
else
{
    areEqual = val1.Equals(val2, StringComparison.InvariantCulture);
}
return areEqual ? 0 : 1;

答案 5 :(得分:1)

多次退货也不错,有时难以维护。设置一个标志可能是“干净的”,但是你正在让计算机在以后做更多不必要的工作,这会导致全球变暖: - )。

答案 6 :(得分:0)

首先,你是否应该首先改变它是有争议的。很多时候你拥有的是一个很好的解决方案,如果你的代码也很好看。

替代方案是:

  1. 声明一个变量,在每个分支中分配它并在函数的右括号中返回
  2.      int result = 0;
         if( IgC ) {
           if( val1.ToUpper() == val2.ToUpper() ) {
               result = 0;
           } else {
               result = 1;
           }
        } else {
           if (val1 == val2) {
              result = 0;
           } else {
               result = 1;
           }
        }
        return result;
    
    
    1. 使用一组三元运算符(condintion?variant1:variant2)。我不推荐这里 - 我认为代码可读性会受到影响。

答案 7 :(得分:0)

您可以收集返回信息,最后将其返回,如下所示:

int res = 0;
if(conditionA) res = 0;
else if(conditionB) res = 1;
else if(conditionC) res = 2;
else if(conditionD) res = 0;

return res;

虽然,我通常会说有一个以上的退货声明是可以的......

答案 8 :(得分:0)

 return IgC?(val1.ToUpper() == val2.ToUpper() ? 0 : 1) : (val1== val2 ? 0 : 1);

    return 1;

答案 9 :(得分:0)

怎么样:

    if (IgC) {
        val1 = val1.ToUpper ();
        val2 = val2.ToUpper ();
    }

    return (val1 == val2)? 0: 1;

答案 10 :(得分:0)

if ((IgC && (val1.ToUpper() == val2.ToUpper())) || (val1 == val2))
 return 0
return 1;

或作为三元

return ((IgC && (val1.ToUpper() == val2.ToUpper())) || (val1 == val2)) ? 0 : 1;

答案 11 :(得分:0)

逻辑看起来真的倒退了,但是......

    bool valuesAreNotTheSame = true;
    if (IgC)
    {
        if (val1.ToUpper() == val2.ToUpper())
        {
            valuesAreNotTheSame = false;
        }
    }
    else
    {
        if (val1 == val2)
        {
            valuesAreNotTheSame = false;
        }
    }
    return valuesAreNotTheSame;

答案 12 :(得分:0)

if ((Igc && val1.ToUpper() == val2.ToUpper()) || (!Igc && val1 == val2)) return 0;

if ((Igc && val1.ToUpper() != val2.ToUpper()) || (!Igc && val1 != val2)) return 1;

或者你可以使用它:

return ((Igc && val1.ToUpper() == val2.ToUpper()) || (!Igc && val1 == val2)) ? 0 : 1;

答案 13 :(得分:0)

这转变为代码高尔夫:-)另一种方法是在你检查IgC之前先做一个区分大小写的比较。

        return (val1==val2)?0:(IgC && (val1.ToUpper()==val2.ToUpper())?0:1);

这可能有更好的性能,因为如果字符串通过简单的比较,那么IgC的值是无关紧要的,并且您节省了不区分大小写的比较费用。

当然,如果我维护生产代码,我宁愿看到原始示例(包括多个return语句)。

答案 14 :(得分:0)

你为什么不写这个?

return (String.Compare(val1, val2, ignoreCase) == 0) ? 0 : 1;