跳转到最后,不调用返回

本文关键字:调用 返回 最后 | 更新日期: 2023-09-27 18:16:00

在c#中(当使用try/finally时)如何在不调用return的情况下跳转到finally节

例如:

public bool SomeMethod()
{
    try
    {
        ...
        if (...)
        {
            ---> Jump to finally
        }
        else
        {
            ...
        }
        ...
        if (...)
        {
            ---> Jump to finally
        }
        else
        {
            ...
        }
        ...
        return true;
    }
    finally
    {
        ...
        if (...)
            return true;
        else
            return false;
    }
}

我怎么能强制跳转到最后一节(不使用返回)?

编辑:

我要做的是:

public bool SomeMethod(ref string Error)
{
    try
    {
        bool result = false;
        if (...)
            ---> Exit to Finally
        else
            ...
        ...
        if (...)
            ---> Exit to Finally
        else
            ...
        ...
        --> more of the above kind of IFs
        return true;
    }
    finally
    {
        ...
        if (!result)
        {
                LogAMessage("");
                ...
                Error = "...";
                ...
        }
        return result;
    }
}

跳转到最后,不调用返回

您可以使用标签和goto

然而,这似乎表明你的函数可能没有很好地组织。

在这种情况下,您似乎正在使用finally作为函数 -为什么不将该逻辑提取到自己的函数中呢?

您有几个选择:

  • 在try/finally块内部或外部添加一个虚拟块,并使用break:

    // dummy block inside
    try {
        do {
            ...
            if (condition)
                break;
            ...
        } while (false);
    } finally {
        ...
    }
    // dummy block outside
    do {
        try {
            ...
            if (condition)
                break;
            ...
        } finally {
            ...
        }
    } while (false);
    
  • 在finally块前面添加一个标签,并使用goto(注意一般不建议使用goto)。

  • 把你的块放到一个单独的方法中,这样你就可以在不离开外部方法的情况下使用返回

你真的不应该这么做…

考虑重写你的代码,使其不再需要goto -> finally。

也许把finally块中的代码拉到一个方法中,然后在多个地方调用它…

您可以通过以下方式获得所需的行为:

public bool SomeMethod(ref string Error)
{
  bool result = false;
  try
  {
    if (...)
    {
        return result;
    }
    else
    {
        result = true;
        ...
        return result;
    }
}
finally
{
    if (!result)
    {
            LogAMessage("");
            ...
            Error = "...";
            ...
    }
}

然而,要实现这样的事情,您应该查看委托模式,以获得更清晰的方式来实现此日志记录。

也许可以考虑把这个方法放在一个实现IDisposable的类中。

然后您可以调用此方法,而它是一个using语句包装,将保证被清除。