在void方法中使用return是不好的做法吗?

81 c# return void

想象一下以下代码:

void DoThis()
{
    if (!isValid) return;

    DoThat();
}

void DoThat() {
    Console.WriteLine("DoThat()");
}
Run Code Online (Sandbox Code Playgroud)

在void方法中使用return是否可以?它有任何性能损失吗?或者写一个这样的代码会更好:

void DoThis()
{
    if (isValid)
    {
        DoThat();
    }
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 166

void方法中的返回也不错,反转if语句以减少嵌套是一种常见的做法.

并且在方法上嵌套较少可提高代码可读性和可维护性.

实际上,如果你有一个没有任何return语句的void方法,编译器将始终在它结束时生成一个ret指令.


Jas*_*ams 28

使用防护(与嵌套代码相对)还有另一个很好的理由:如果另一个程序员将​​代码添加到您的函数中,它们就会在更安全的环境中工作.

考虑:

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

与:

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

现在,想象另一个程序员添加行:obj.DoSomethingElse();

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }

    obj.DoSomethingElse();
}

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
    obj.DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

显然这是一个简单的情况,但程序员在第一个(嵌套代码)实例中为程序添加了一个崩溃.在第二个例子中(使用警卫提前退出),一旦你越过警卫,你的代码就可以安全地无意中使用空引用.

当然,一个优秀的程序员不会犯这样的错误(经常).但预防胜于治疗 - 我们可以用一种完全消除这种潜在错误来源的方式编写代码.嵌套增加了复杂性,因此最佳实践建议重构代码以减少嵌套.

  • 我正在争论减少筑巢!:-) (17认同)

Ras*_*dit 18

糟糕的做法??? 没门.事实上,如果验证失败,最好通过最早从方法返回来处理验证.否则会导致大量的嵌套ifs和elses.提前终止可提高代码可读性.

还要检查类似问题的回答:我应该使用return/continue语句而不是if-else吗?


cdm*_*kay 8

第一个示例是使用保护语句。来自维基百科

在计算机编程中,守卫是一个布尔表达式,如果程序要在所讨论的分支中继续执行,它的计算结果必须为真。

我认为在一个方法的顶部有一堆守卫是一种完全可以理解的编程方式。它基本上是在说“如果其中任何一个为真,则不要执行此方法”。

所以一般来说它会是这样的:

void DoThis()
{
  if (guard1) return;
  if (guard2) return;
  ...
  if (guardN) return;

  DoThat();
}
Run Code Online (Sandbox Code Playgroud)

我认为那更具可读性:

void DoThis()
{
  if (guard1 && guard2 && guard3)
  {
    DoThat();
  }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*all 6

这是不错的做法(由于所有原因已经说明).但是,您在方法中获得的回报越多,就越有可能将其拆分为更小的逻辑方法.


Rus*_*ell 3

没有性能损失,但是第二段代码更具可读性,因此更容易维护。