C# 在一个方法中使用多个RETURN语句是否是一种好的做法?
可能重复:C# 在一个方法中使用多个RETURN语句是否是一种好的做法?,c#,asp.net,C#,Asp.net,可能重复: 我想知道在一个方法中使用几个返回语句是否是一种良好的实践,以及为什么。 如果没有,我想知道您将如何以不同的方式重写代码 public string GetNominativeById(int? candidateId) { if (candidateId.HasValue) return repepositoryCandidate.GetById(candidateId.Value).Nominative;
我想知道在一个方法中使用几个返回语句是否是一种良好的实践,以及为什么。 如果没有,我想知道您将如何以不同的方式重写代码
public string GetNominativeById(int? candidateId)
{
if (candidateId.HasValue)
return repepositoryCandidate.GetById(candidateId.Value).Nominative;
else
return string.Empty;
}
}
一劳永逸
public string GetNominativeById(int? candidateId)
{
string result;
if (candidateId.HasValue)
result = repepositoryCandidate.GetById(candidateId.Value).Nominative;
else
result = string.Empty;
return result;
}
}
习惯在方法末尾添加
return
,因此必须关闭所有活动对象(如果有)
旁注:三元运算符并不是这个问题的真正答案(我认为),因为在
IF
语句中存在多个代码块的情况。为什么不?但你不需要其他的
public string GetNominativeById(int? candidateId)
{
if (candidateId.HasValue)
return repepositoryCandidate.GetById(candidateId.Value).Nominative;
return string.Empty;
}
尽管为了可读性,您应该尽量只使用一个返回语句,但是有几个模式涉及多个返回语句。一个例子是 保护条款示例:
public Foo merge (Foo a, Foo b) {
if (a == null) return b;
if (b == null) return a;
// complicated merge code goes here.
}
一些风格指南会让我们写一个单一的回报如下
public Foo merge (Foo a, Foo b) {
Foo result;
if (a != null) {
if (b != null) {
// complicated merge code goes here.
} else {
result = a;
}
} else {
result = b;
}
return result;
}
另一种情况是switch语句,您可能希望从每个情况返回:
switch(foo)
{
case "A":
return "Foo";
case "B":
return "Bar";
default:
throw new NotSupportedException();
}
我会将您的代码改写为:
public string GetNominativeById(int? candidateId)
{
return candidateId.HasValue
? repepositoryCandidate.GetById(candidateId.Value).Nominative;
: string.Empty;
}
在一天结束时,请记住您(和其他开发人员)将多次阅读您的代码,因此请确保其可读性和明显性。您实际上不需要
else
string GetNominativeById(int? candidateId)
{
if (!candidateId.HasValue)
return string.Empty;
return repepositoryCandidate.GetById(candidateId.Value).Nominative;
}
考虑这种反箭头模式:
立即返回的方式将使代码更具可读性:
if (!condition1) return;
if (!condition2) return;
if (!condition3) return;
// code lines
看看维基百科上的以下内容。您要问的是,您是否应该遵循结构化编程中的SESE(单输入单输出)原则。所有这些都取决于
- 与其他开发人员一起使用的编码标准
- 和实际代码可读性(因此个人对代码的感知)
if/else
变得太多时,我使用return
因此,与其使用:
if(...)
{
if(...)
{
if(...)
{
}
}
else if(...)
{
}
..
else
{
}
}
使用返回键
:
if(!...)
return;
if(!...)
return;
规则之一规定每个方法都应该有一个入口和出口点。拥有一个退出点(
return,在本例中为
语句)意味着任何清理,例如调用Close或Dispose,只需要执行一次。拥有多个退出点对小方法的影响很小,但随着方法复杂性的增加而增加,在这种情况下,可能很容易遗漏一个案例,或者作为重构或修改的代码。实际上,在一个方法中不能使用多个return语句,您在代码中所做的是使用if-else语句,因此,无论如何,只有一个将被执行。您的代码对我来说似乎不错。不,在一个方法中有多个退出点被认为是不好的做法,而不是很好的做法。如果只有一个出口点,则更容易遵循代码
然而,当该方法像示例中那样小时,无论如何都不难遵循代码,因此拥有多个退出点并不是一个真正的问题。如果它使代码更简单,您可以很好地使用多个
return
语句。如果需要,那么为什么不使用多个return语句呢。性能不会有问题
要重写此代码,请执行以下操作:
public string GetNominativeById(int? candidateId)
{
if (candidateId.HasValue)
return repepositoryCandidate.GetById(candidateId.Value).Nominative;
return string.empty;
}
或使用“三元运算符”
拥有更多的return语句并没有什么错,有时它实际上可以帮助您缩小代码规模,并保存一些不必要的变量赋值,就像Cuong Le所指出的那样:D“如果可以被认为是好的做法”——你怎么看?返回越多越好?第二个示例应该会产生一个关于无法访问代码的警告。哪种回答您的问题。请参阅。这个问题并没有真正的答案,这完全是一个意见问题,双方都有狂热者。另一个重复:有趣的方法非常感谢!有趣的一点非常感谢!最好使用:if(condition1&&condition2&&condition3){//code-lines}“因此您必须关闭任何活动对象”--这到底意味着什么?感谢您指出本文!谢谢Guffa的评论!为什么要投否决票?如果你不解释你认为错误的地方,就无法改善答案。
如果只有一个出口,那么遵循代码就更容易。
在很多情况下是的,但我不同意一般情况。其他答案包括几个代码示例,使用多个返回语句更容易阅读。第二个示例使用“一个”退出点,实际上有多个退出点。如果repepositoryCandidate为null或GetById()返回null或引发异常,则该简单方法有更多的退出点。按照多个退出点都是“坏”的逻辑,那么你必须捕获/吞下所有的异常来维持一个单一的退出点才是“好”的做法。我不认为在这方面有共识,就像你的答案所说的那样。我完全不同意这是一个普遍的原则,并看到人们破坏代码,可以简单得多,只是有一个单一的退出点。如果你知道你可以在一个循环中提前退出,比如说,读一个被设置的标志,然后跳出循环,然后重新检查标志或稍后返回标志,与只在循环中返回一个已知结果的return语句相比,这到底有多容易?我只是这样做了,修改了一些旧代码。if/else有几层,我不想再添加一层,但也不想重写/重构很多代码。然后我遇到了这个问题,想看看现在有多个出口是否是一种好的做法。这篇文章有一些优点。
if(!...)
return;
if(!...)
return;
public string GetNominativeById(int? candidateId)
{
if (candidateId.HasValue)
return repepositoryCandidate.GetById(candidateId.Value).Nominative;
return string.empty;
}
public string GetNominativeById(int? candidateId)
{
return candidateId.HasValue ? repepositoryCandidate.GetById(candidateId.Value).Nominative : string.Empty;
}