[英]how to stop the execution of current method call
如果發生條件,我必須停止執行當前方法並返回到方法調用之前的狀態。我該怎么辦..假設我正在執行一些示例方法,並且條件發生並且我正在提示消息框然后我想回到此函數調用之前的狀態
如果我對您的理解正確,那么您希望撤消對某些變量所做的更改(如果某些條件成立)? 在這種情況下,您將要存儲所有變量(或整個類)的副本。 然后,如果條件成立,則必須將所有這些變量恢復為初始狀態,然后再從函數中返回。 就像這樣:
// 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;
}
}
對我來說,堆上的通用回滾功能是聞所未聞的。 但是您可以使用命令模式來獲取撤消功能並將其用於回滾:
http://en.wikipedia.org/wiki/Command_pattern
本質上,您將一個操作封裝在一個對象中,該對象存儲有足夠的更改信息,可以撤消該操作。 您將該對象壓入堆棧,然后在發生情況時,從堆棧中彈出所有命令對象並撤消它們。 如果沒有有關您案件的更多信息,很難提供更具體的信息或告訴您這是否適用。
是在調用該方法之前可能已經檢查過的錯誤條件嗎? 如果是這樣,則引發異常。
否則, return
有意義的東西(例如,如果它是一個void
函數,請將其更改為返回bool
,然后返回false
)。
這就是例外。 您引發異常以終止函數和任何調用程序,直到到達異常處理程序為止。
請注意,只有在發生異常情況時才應這樣做。 異常不應用作“不同種類的”返回值,因為它們在代碼大小(是否拋出)和運行時間(如果拋出)方面比正常返回的代價更高。
只要返回到您以前的狀態, 如果您的代碼和進行調用的所有庫代碼均以異常安全的方式編寫,則可以做到這一點。
我猜您在談論對象事務或事務內存。
您要做的至少是,您可以記錄要修改的對象的狀態(賦值),並在賦值條件失敗時在其上寫入舊值。
另一個解決方案,與上述解決方案略有不同:
現在再在示例方法中檢查指定條件。
public void MyMethod()
{
some code
if (conditionOccurred == true){ reset to the previous state and exit;}
more code
}
這可能不是本書所講的,但是如果您不經常使用它,它將給出非常簡單易讀的代碼。
我可能不必提一下,如果您希望能夠返回到程序狀態,則需要保存該程序的狀態,並且您需要編寫一些代碼以使您返回該狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.