문제

이 질문은 이것에 대한 일종의 추가 기능입니다. 질문

C#에서는 스위치 케이스가 다른 케이스로 넘어갈 수 없으므로 컴파일 오류가 발생합니다.이 경우 선택한 달과 그 이후의 각 달의 총계에 숫자를 추가하기만 하면 됩니다.(간단한 예, 실제는 아닙니다)

switch (month)
{
    case 0:
      add something to month totals
    case 1:
      add something to month totals
    case 2:
      add something to month totals
    default:
      break;
}

수많은 if 문을 작성하지 않고도 C#에서 이에 대한 논리적 대안이 있습니까?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
도움이 되었습니까?

해결책

거대한 스위치 문이나 둘 이상의 블록에 속할 수 있는 많은 if 문에서 잡음이 나타나는 경우가 종종 있는데 이는 잘못된 디자인을 억제하려는 것입니다.

대신, 사양 패턴을 구현하여 일치하는 항목이 있는지 확인한 다음 그에 따라 조치를 취하면 어떻게 될까요?

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

그런 다음 수행하려는 작업과 일치하는 다양한 사양을 추가하면 됩니다.

귀하의 도메인이 무엇인지 알기가 어렵기 때문에 제 예가 약간 인위적으로 만들어졌을 수도 있습니다.

다른 팁

C# 스위치 문에서는 통과하려는 사례에 대한 문이 없는 경우에만 사례를 통과할 수 있습니다.

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

그러나 명령문을 제대로 작성하지 않으려면 두려운 GOTO를 사용해야 합니다.

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

상수를 추가하고 있나요?그렇다면 아마도 다음과 같은 것이 작동할 것입니다(C 구문):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

다음 달의 합계에 상수를 추가하는 것보다 더 복잡한 명령문이 필요한 경우 변수 또는 함수 포인터를 사용하여 비슷한 작업을 수행할 수 있습니다.

-아담

이 주제를 다루는 질문이 이미 있습니다.

C# 스위치 문의 제한 사항 - 이유는 무엇입니까?

편집하다:

이 점을 지적하는 주요 목적은 거의 동일한 이름의 두 가지 질문이 질문 풀에 혼란을 더한다는 것입니다.

스위치 케이스를 역순으로 작성하세요.

case 2:

case 1:

case 0:

break;


default:

도움이 되었기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top