C# 스위치:다른 경우에 해당되지 않는 경우 제한
-
09-06-2019 - |
문제
이 질문은 이것에 대한 일종의 추가 기능입니다. 질문
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];
다음 달의 합계에 상수를 추가하는 것보다 더 복잡한 명령문이 필요한 경우 변수 또는 함수 포인터를 사용하여 비슷한 작업을 수행할 수 있습니다.
-아담
이 주제를 다루는 질문이 이미 있습니다.
편집하다:
이 점을 지적하는 주요 목적은 거의 동일한 이름의 두 가지 질문이 질문 풀에 혼란을 더한다는 것입니다.
스위치 케이스를 역순으로 작성하세요.
case 2:
case 1:
case 0:
break;
default:
도움이 되었기를 바랍니다!