【发布时间】:2016-10-13 08:55:00
【问题描述】:
我有一堆开关在里面。我需要代码一次停留在一个案例中,直到满足特定标准,然后我想告诉它要转到哪个案例。我目前有自己的情况,这不会导致错误,但确实会导致我正在使用的程序不断加载并且永远不会执行。
我需要满足的条件是 bool 语句“已激活”,在此之前我希望代码保留在案例中。
缺少很多代码,因此可能没有意义,但我想知道是否有更好的方法来做到这一点。
另外,在你问之前,我还是个初学者,我知道每个人都讨厌 goto 语句。如果你能提出一个替代方案,我会听的。
谢谢聪明人。
if(CurrentPosition.Value != 0){
switch(location)
{
case 0:
if(criteria1 && criteria2)
{
LimitLongsPT.Send(S1 + ((R1 - S1) * BuffZone));
LongStopSA.Send(S1 - StopAmount);
ShortStopDeep.Send(R1 + StopAmount);
TradeManager.ProcessEvents();
if(activated == true)
{
if(PublicFunctions.DoubleEquals(CurrentPosition.Value, 0))
{
break;
}
if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0))
{
if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1))
{
goto case 15;
}
if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2))
{
goto case 16;
}
if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1))
{
goto case 23;
}
}
if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0))
{
if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2))
{
goto case 1;
}
}
}
}
**goto case 0;**
case 1:
if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2))
{
【问题讨论】:
-
或多或少看起来你已经在角落里编码了自己;因为你打开一件事,然后 if...else 在另一件事上;考虑到“案例 23”,这个功能似乎也是巨大的。您需要分解您的代码并仔细考虑您在此代码中的每个行为,以便您可以封装它。这将有助于在相关条件下使用原子逻辑。
-
在这种情况下,
goto的替代方案是 状态机,其中switch块会随着时间的推移多次执行。goto通常表示设计不佳,并且您喜欢折磨小猫;) -
这里的标准变量听起来会随着时间而变化。 case 0: goto case 0 是一个循环。您是否考虑过重构为 while 循环?
-
感谢您的回复,我确实忘记提及了,但 Assaf 做到了。随着时间的推移,条件会得到满足,它是一个我无法控制的不断变化的变量,是的,开关中有 32 个案例。我使用 while 循环开始此操作,但无法使其正常工作。我将研究这个“状态机”。再次感谢。
标签: c# switch-statement