如何停止当前方法调用的执行

时间:2009-04-14 06:37:27

标签: c#

如果发生了一个条件,我必须停止当前方法调用的执行并返回到方法调用之前的状态。我可以这样做..假设ai正在执行一些示例方法并且出现了一个条件而且我正在提示一个消息框,然后我想在此函数调用之前返回状态

7 个答案:

答案 0 :(得分:5)

如果我正确理解你,如果某些条件成立,你希望撤消对某些变量所做的更改吗?如果是这种情况,您将需要存储所有变量(或整个类)的副本。然后,如果你的条件成立,你必须在从函数返回之前将所有这些变量恢复到它们的初始状态。它会是这样的:

// In order to clone your variable, you may need to inherit from 
// ICloneable and implement the Clone function.
bool MyFunction(ICloneable c)
{
    // 1. Create a copy of your variable
    ICloneable clone = c.Clone();

    // 2. Do whatever you want in here
    ...

    // 3. Now check your condition
    if (condition)
    {
        // Copy all the attributes back across to c from your clone
        // (You'll have to write the ResetAttributes method yourself)
        c.ResetAttributes(clone);

        // Put a message box up
        MessageBox.Show("This failed!");

        // Now let the caller know that the function failed
        return false;
    }
    else
    {
        // Let the caller know that the function succeeded
        return true;
    }
}

答案 1 :(得分:2)

堆上的通用回滚功能对我来说是闻所未闻的。但您可以使用Command模式获取撤消功能并使用它进行回滚:

http://en.wikipedia.org/wiki/Command_pattern

本质上,您将操作封装在一个对象中,该对象存储了可以撤消它的更改的足够信息。将该对象推送到堆栈上,当条件发生时,您将从堆栈中弹出所有命令对象并撤消它们。如果没有关于您的案例的更多信息,很难提供更具体的信息或告诉您这是否适用于您。

答案 2 :(得分:1)

在调用方法之前是否可以检查错误条件?如果是这样,请抛出异常。

否则,return有意义的内容(例如,如果它是void函数,请将其更改为返回bool,然后返回false

答案 3 :(得分:1)

这是例外情况。抛出异常以终止函数和任何调用者,直到达到异常处理程序。

请注意,只有在发生异常情况时才应该这样做;异常不应该被用作“不同类型”的返回值,因为它们在代码大小(无论是否抛出)和运行时间(如果抛出)方面比正常返回更昂贵。

至于返回之前的状态,这可能是如果您的代码和通过其进行调用的任何库代码以异常安全方式编写。

答案 4 :(得分:0)

我猜你正在谈论对象事务或事务内存。

您可以做的最少的事情就是记录被修改对象的状态(赋值),并在分配条件失败时在其上写入旧值。

答案 5 :(得分:0)

另一种解决方案,与上述方案略有不同:

现在检查指定的条件,然后在样本方法中检查。

public void MyMethod()
{
some code

if (conditionOccurred == true){ reset to the previous state and exit;}

more code
}

这可能不是根据书中的说法,但是如果您不经常使用它,它会提供非常简单易读的代码。

我可能不必提到你需要保存程序的状态,如果你想能够返回它,你需要写一些代码让你回到这种状态。

答案 6 :(得分:-2)

您可以使用Memento pattern实现对象回滚。来自here ...

  

看护人会做点什么   对发起人,但想成为   能够撤消变化。看守   首先要求发起人   纪念品。然后它做任何事情   操作(或操作顺序)   它会发生。回滚   它在运作之前的状态   将memento对象返回给   始发。

收到表明您应该回滚的事件后,您可以撤消更改并返回给调用者。这里有一些info. and links为什么你不应该使用Thread.Abort。