2016-06-13 1 views
0

스위치에 여러 사례가 있습니다. 특정 기준이 충족 될 때까지 한 번에 한 가지 경우에 머물도록 코드가 필요합니다. 그런 다음 어떤 사례로 가야할지 말해주고 싶습니다. 나는 현재이 사건을 스스로 진행하고 있는데, 이것은 오류를 일으키지 않지만 계속로드하고 실행하지 않는 프로그램을 유발합니다.C# 스위치의 특정 사례 반복

필자가 만족해야 할 기준은 bool 문 'activated'이며, 그 때까지는 코드가 남아 있어야합니다.

누락 된 코드가 많아 이해가되지 않을 수 있지만 더 좋은 방법이 있는지 알고 싶습니다.

또한 물어보기 전에, 나는 아직 초보자이며 모두가 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)) 
        { 
+3

다소 차이가있을 수 있습니다. 너는 한 가지만 켜고 그 다음에는 ... 다른 한 가지만 켜기 때문에. '사례 23'을 고려할 때이 기능은 엄청난 것 같습니다. 코드를 분해하고이 코드에있는 각 동작을 신중하게 생각하여 캡슐화 할 수 있어야합니다. 이것은 관련 조건에 대한 논리의 원자 비트 사용에 도움이됩니다. – zaitsman

+5

이 경우 'goto'의 대안은 'switch'블록이 시간이 지남에 따라 여러 번 실행되는 _state machine_입니다. 'goto'는 일반적으로 가난한 디자인의 징후이고 고양이를 고문하는 것을 좋아합니다;) – MickyD

+1

시간이 지남에 따라 변수가 변하는 것 같습니다. case 0의 경우 : goto case 0은 루프입니다. while 루프로 리팩터링을 고려해 보셨습니까? – Assaf

답변

1

스위치를 while 루프에 넣고 "location"을 다음에 원하는 값으로 설정해야합니다. 개인적으로 나는 그런 큰 혼란을 피할 것이며, 좀 더 그것을 평평하지만

if(CurrentPosition.Value != 0){ 
     while (location > -1) { 
      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)) 
          { 
           location = -1; 
           break; 
          } 
          if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1)) 
           { 
            location = 15; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 16; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1)) 
           { 
            location = 23; 
            break; 
           } 
          } 
          if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 1; 
            break;; 
           } 
          } 
         } 
        } 
        location = 0; 
        break; 
       case 1: 
        if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
        { 

. 필요한 경우 State Machine을 조사하십시오.