如何消除一个语句的多个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;
}
}
答案 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)
首先,你是否应该首先改变它是有争议的。很多时候你拥有的是一个很好的解决方案,如果你的代码也很好看。
替代方案是:
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;
答案 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;