C#中的setjmp / longjmp.可能吗?
当我需要在本地范围内进行转到时,我遇到了一个问题:
if(...) { DoSomethingHere(); if (...) goto Label; } else if(...) { Label: DoSomethingHereToo(); } ,显然在C#中是不可能的. 是的我知道使用goto被认为是一种不好的做法,但在这种情况下使用goto更容易.因此,我宁愿不进入整个“goto是所有邪恶的来源”的讨论.对我来说,一个更有趣,更普遍的问题是C#中setjmp / longjmp的可能性.那么可能吗? 解决方法
首先,我认为你在本地范围内做一个“转到” – 一个短暂的跳跃 – 跳远 – 在当前方法之外完全转到某个地方.可以通过两种方式考虑经典的C风格跳远:一,它就像抛出一个不清理堆栈帧的异常.二,就像从函数返回到“错误”的地址.
在C#中,以上都不可能. C#不支持跳远;我们尝试抓住最终投掷,以干净,结构化和安全的方式进行非本地游戏. C#也不支持从局部变量声明空间外部到空间内的短跳转.原因是因为从外面跳到一个街区的中间是令人困惑,危险,难以理解和难以维护.完成此设计目标的方法是使标签与局部变量具有相同的范围. “goto”甚至看不到标签,只是该位置的代码会看到在不同的局部变量声明空间中声明的局部变量. 在没有使用任何goto语句的情况下,有很多方法可以解决您的问题.例如,立即想到的是 bool doFirstThing = false; bool doSecondThing = false; if (firstCondition) { doFirstThing = true; doSecondThing = true; } else if (secondCondition) { doSecondThing = true; } if (doFirstThing) { DoFirstThing(); } if (doSecondThing) { DoSecondThing(); } 这非常简单,易于阅读,易于调试等等. 或者:如果“doSecondThing”结果中的共享代码实际上难以重构为自己的方法,那么请考虑退一步并确定您的控制流是否过于复杂而无法开始.例如,如果您在循环中改变了大量变量,那么可能有一些技术可以用来简化这种情况并减少突变.您能否提供有关此代码正在做什么以及为何难以重构的更多信息? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |