好的做法是在方法中多使用一个RETURN语句吗?

Gib*_*boK 15 c# asp.net

可能重复:
为什么在方法结束时返回是一个好习惯

我想知道是否可以认为良好做法在方法中使用多个RETURN语句以及为什么.如果没有,我想知道如何以不同的方式重写代码.

public string GetNominativeById(int? candidateId)
        {
            if (candidateId.HasValue)
                return repepositoryCandidate.GetById(candidateId.Value).Nominative;
             else
                return string.Empty;
            }
        }
Run Code Online (Sandbox Code Playgroud)

一个回归

 public string GetNominativeById(int? candidateId)
    {
        string result;
        if (candidateId.HasValue)
            result =  repepositoryCandidate.GetById(candidateId.Value).Nominative;
         else
            result =  string.Empty;

        return result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

cuo*_*gle 25

你实际上并不需要 else

string GetNominativeById(int? candidateId)
{
    if (!candidateId.HasValue)  
        return string.Empty;

    return repepositoryCandidate.GetById(candidateId.Value).Nominative;
}
Run Code Online (Sandbox Code Playgroud)

考虑这种反箭头模式:

if (condition1)
{
    if (condition2)
    {
        if (condition3)
        {
            // code lines
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

立即返回的方式将使您的代码更具可读性:

if (!condition1) return;
if (!condition2) return;
if (!condition3) return;

// code lines
Run Code Online (Sandbox Code Playgroud)

  • 有意思的话非常感谢! (2认同)

Guf*_*ffa 14

不,在方法中有多个退出点被认为是不好的做法.如果只有一个退出点,则更容易遵循代码.

但是,当该方法与示例中一样小时,无论如何都不难遵循代码,因此具有多个退出点并不是真正的问题.如果它使代码更简单,你可以很好地使用多个return语句.

  • 为什么选择downvote?如果你不解释你认为*错误*,它无法改善答案. (6认同)

Jak*_*cki 10

尽管为了可读性目的,您应该努力只有一个return语句,但是有几个模式涉及多个return语句.一个例子是Guard Clause.

保护条款的例子:

  public Foo merge (Foo a, Foo b) {
    if (a == null) return b;
    if (b == null) return a;
    // complicated merge code goes here.
  }
Run Code Online (Sandbox Code Playgroud)

一些样式指南会让我们用一个返回来写这个,如下所示

  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;
  }
Run Code Online (Sandbox Code Playgroud)

另一种情况是当您可能希望从每种情况返回时的switch语句:

switch(foo)
{
   case "A":
     return "Foo";
   case "B":
     return "Bar";
   default:
     throw new NotSupportedException();
}
Run Code Online (Sandbox Code Playgroud)

我会将您的代码重写为:

        public string GetNominativeById(int? candidateId)
        {
            return candidateId.HasValue 
                ? repepositoryCandidate.GetById(candidateId.Value).Nominative;
                : string.Empty;
        }
Run Code Online (Sandbox Code Playgroud)

在一天结束时,请记住您(和其他开发人员)将多次阅读您的代码,因此请确保它的可读性和显而易见性.


Kon*_*nev 7

请查看维基百科上的以下文章.你要问的是你是否应该遵循结构化编程的SESE(单入口,单出口)原则.