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