코드는 간결합니다. 런타임시 switch
문은 실제로 점프 테이블이므로 if
문을 범위 식 (예 : if(1 <= x && x <= 5)
)으로 병합하더라도 일련의 if()
문보다 상당히 빠릅니다. 모든 경우에 적용하려는 경우 의 case
문 집합은 전체이어야합니다. 따라서 0이 아닌 값 (switch
은 String
값은 특수한 경우입니다)과 함께 switch
을 사용할 수 없습니다.
사례와 피연산자 사이에 명백한 수학적 관계가 있음을 알 수 없으므로 코드를 크게 단순화하는 데 사용할 수 있습니다. 개념적으로 이해하기 쉽도록 코드를 리팩터링 할 수 있습니다. 먼저 income = hours *
부분을 제거하면됩니다. 이를 단순히 시간당 요율을 반환하는 독립 실행 형 함수로 이동하면됩니다.
int GetHourlyRate(int hours) {
switch(hours) {
case 1: case 2: case 3: case 4: case 5:
return 5;
case 6: case 7:
return 6;
case 8: case 9: case 10:
return 7;
case 11: case 12: case 13: case 14: case 15:
return 8; // you put 7 in your original example, is that correct and not a typo?
default:
if(hours <= 24) return 10;
return 0; // or throw an exception?
}
}
int hourlyRate = GetHourlyRate(hours);
return income = hours * hourlyRate;
그래도 거대한 switch
/case
블록은 세로 공간에 저장하기 위해 수행 한 스타일로 축소해도 (C#은 공백에 영향을받지 않음) 여전히 읽을 수 없습니다.
하나의 옵션은, 적어도 시각, 그것을 단순화하기 쉽게도 유지 보수 할 것이다, T4를 사용하여 metaprogram하는 것입니다 생성 할 ...
<#
using R = Tuple<Int32,Int32>;
R[] hourlyRates = new R[] {
new R(5, 5),
new R(7, 6),
new R(10, 7),
new R(15, 8),
new R(24, 10)
};
WriteLine("switch(hours) {");
for(Int32 r = 0, i = 1; r < hourlyRates.Length; i++) {
WriteLine("case {0}:", i);
if(i == hourlyRates[r].Item1) {
WriteLine("return {0};", hourlyRates[r].Item2);
r++;
if(r >)
}
}
WriteLine("}");
#>
당신의 switch
에 정의 된 hourlyRates
목록을 기반으로 T4 파일.
출처
2017-02-16 22:01:33
Dai
휴식 시간이 누락되었습니다. – OldProgrammer
사례 변수와 배율 사이에 수학적 관계가 있습니까? 나는 하나를 식별 할 수 없다. –
왜 불필요한 케이스를 사용합니까? 그냥 내버려 두십시오. – Thibaut