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

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

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

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语句。

你实际上并不需要else

 string GetNominativeById(int? candidateId) { if (!candidateId.HasValue) return string.Empty; return repepositoryCandidate.GetById(candidateId.Value).Nominative; } 

考虑这种反箭头模式

 if (condition1) { if (condition2) { if (condition3) { // code lines } } } 

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

 if (!condition1) return; if (!condition2) return; if (!condition3) return; // code lines 

尽管为了可读性目的,您应该努力只有一个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. } 

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

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

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

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

有更多的return语句没有错,有时它实际上可以帮助你缩小代码并保存一些不必要的变量赋值,就像Cuong Le所指出的那样。 :d

这一切都取决于

  • 您与其他开发人员使用的编码标准
  • 和实际的代码可读性(所以代码的个人感知)

一般来说,当if/else变得过多时,我会改用return

所以不要使用:

 if(...) { if(...) { if(...) { } } else if(...) { } .. else { } } 

使用return

 if(!...) return; if(!...) return; 

养成在方法结束时添加return的习惯,因此您必须关闭所有活动对象( 如果有

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

注意:三元运算符实际上并不是一个答案( 我认为 ),因为有些情况下你的IF语句中有多个代码块。

结构化编程规则之一指出每个方法应该有一个入口和出口点。 具有单个出口点(在这种情况下为return语句)意味着任何清理,例如调用Close或Dispose,只需要发生一次。 具有多个退出点的影响在小方法上较小,但随着方法复杂性的增加而增加,可能容易错过案例,或者作为重构或修改的代码。

你实际上不能在一个方法中使用多个return语句,你在代码中做了什么,你使用了if else语句,所以无论如何只会执行一个。 你的代码对我来说似乎很好。

是的,如果有必要,那么为什么不使用几个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; } 

为什么不? 但你不需要别的。

 public string GetNominativeById(int? candidateId) { if (candidateId.HasValue) return repepositoryCandidate.GetById(candidateId.Value).Nominative; return string.Empty; }