通过调用方法的C#取消方法

时间:2018-11-23 14:30:29

标签: c# stack-trace

Hello StackOver社区,

我有以下C#代码

void foo(int x)
{
  if(x<=0)
     {
       return;
     }
  do something more...
     .
     .
     .
}

我想通过调用一个函数来摆脱if语句,如果满足x <= 0的条件,该函数将“返回”我的foo函数。

那是

void foo(int x)
{
  TerminateIfNegative(x);

  do something more...
     .
     .
     .
}

private ???? TerminateIfNegative(int a)
{
    if (a<=0)
    {
         "Make the method which called me "return" at the place I was called"
    }
}

我希望我能做些清楚的事情。有人有主意吗?

干杯

弗洛里安

3 个答案:

答案 0 :(得分:2)

当方法的返回类型为void时,此方法不返回任何内容。只有以下选项可以停止void方法内的命令执行:

  • 引发异常
  • 使用return;(这是最常见的方法)

如果不应将负值作为参数传递给您的方法,则抛出异常和document that是有效的,以便此方法的调用者知道这是从一开始的。

答案 1 :(得分:0)

您所要求的行为在过程编程中很常见,在过程编程中,您从第一行到最后一行都有一个通用的线性程序流。这将应用于逐行执行,这不是OOP的目的。我们通常有充分的理由不鼓励使用goto和其他控制程序流的东西,因为这将很难遵循您的代码,例如调试时。实际上,这导致了意大利面条代码。

想象一下您想在几个月后调试您的应用程序。您逐步执行代码,直到到达Foo,然后将其执行以了解其功能,然后-哇,这是什么-调试器出于任何原因跳出Foo。完全不清楚为什么该方法只是停止执行。

您似乎想要的实际上是对用户输入进行一些检查。因此,如果用户输入负数,则程序应停止。在这种情况下,抛出异常是完全可以的,它基本上表明方法无法执行应做的事情。您可以创建一些Validate方法,在ivalid输入上引发异常:

void Validate(int x)
{
    if(x <= 0) 
        throw new InvalidArgumentException("x must not be negative");
}

这使方法的调用者可以处理错误。这样,您的Validate方法就可以验证输入。它不应该终止调用方法,这会破坏单一职责原则,不是吗?

但是,在您的情况下引发异常似乎有点像用大锤砸破螺母。最简单,最干净的方法就是准确地执行您要避免的操作。如果输入无效,则有一个if语句终止foo

void foo()
{
    if(!Validate(x))
        return;
}
bool Validate(int x)
{
    return x > 0;
}

答案 2 :(得分:-3)

实际上,有一个解决方案。和一个非常丑陋的。 我知道可能没有人会同意应使用此方法,但是无论如何我都会提出。这是臭名昭著的goto解决方案:

void foo(int x)
{
  TerminateIfNegative(x);

  do something more...
     .
     .
     .

  EndOfFoo:
}

private void TerminateIfNegative(int a)
{
    if (a<=0)
    {
         goto EndOfFoo;
    }
}