2009-04-18 5 views

답변

7

가장 간단한 방법은 코드에서 if/else를 사용하는 것입니다. 다른 점을 제외하고는 스위치를 사용하는 대신 을 원한다는 것을 독자에게 분명히 알립니다.

편집 : 좋아, 가독성은 중요하지 않지만 기본적으로 컴파일 된 코드를 변경하려면 소스 코드를 변경해야합니다. Mono 컴파일러를 사용하여 직접 수정할 수도 있지만 switch 구문을 사용하고 있다는 사실을 Microsoft 컴파일러에서 무시하도록하는 방법은 없습니다.

+0

switch 문은 어휘 분석기에서 생성되므로 가독성은 중요하지 않습니다. if/else 's가 최후의 수단 인 생성기를 다시 작성 :) – user55017

2

다른 컴파일러 (예 : 모노)를 사용해 보셨습니까? 아니면 문제가있는 클래스를 별도의 어셈블리에 배치하고 다른 언어로 전환하려고하셨습니까?

0

어떻게하면 컴파일러가 이렇게할까요? 내가 VS2008와 테스트를했다 :이

.method public hidebysig static int32 DoSomething(int32 i) cil managed 
{ 
    .maxstack 2 
    .locals init (
     [0] int32 CS$1$0000, 
     [1] int32 CS$4$0001) 
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: stloc.1 
    L_0003: ldloc.1 
    L_0004: ldc.i4.1 
    L_0005: beq.s L_0016 
    L_0007: ldloc.1 
    L_0008: ldc.i4.s 100 
    L_000a: beq.s L_001a 
    L_000c: ldloc.1 
    L_000d: ldc.i4 0x3e8 
    L_0012: beq.s L_001e 
    L_0014: br.s L_0022 
    L_0016: ldc.i4.0 
    L_0017: stloc.0 
    L_0018: br.s L_0026 
    L_001a: ldc.i4.1 
    L_001b: stloc.0 
    L_001c: br.s L_0026 
    L_001e: ldc.i4.2 
    L_001f: stloc.0 
    L_0020: br.s L_0026 
    L_0022: ldc.i4.3 
    L_0023: stloc.0 
    L_0024: br.s L_0026 
    L_0026: ldloc.0 
    L_0027: ret 
} 

없음 스위치 명령 :

public static int DoSomething(int i) { 
    switch (i) { 
     case 1: return 0; 
     case 100: return 1; 
     case 1000: return 2; 
     default: return 3; 
    } 
} 

가 컴파일합니다.

아마도 Microsoft에 버그를 신고해야합니까?

+0

컴파일러를 사용할 수있는 ATM이 없다. 그러나 점프 테이블이 값 1 - 1000 (예 : 1000)로 작성되면 충격을받을 것이다. 항목). 아마도 case 1에 가까워 진 것 같습니다 : case 50 : – user55017

+0

그렇지만 나는 컴파일러가 자신의 경우에도 최적의 코드를 선택하지 않았다면 놀랄 것입니다. 3 가지 경우 만 20 가지의 IL 지침이 배출되었습니다. – erikkallen

+1

컴파일러는 실행 속도에 맞는 최적의 코드를 선택합니다. 메모리 사용을 최적화하고 싶습니다. 20 IL 명령은 여전히 ​​50-100 항목 점프 테이블보다 훨씬 적은 메모리를 사용합니다. – user55017

0

아니요, C# 컴파일러에서 CIL 명령어를 방출하는 방법을 제어 할 권한이 없습니다. 그리고 가능하다해도 AOT 또는 JIT 컴파일러는 CIL 명령어를 고급 컴파일러 최적화로 인해 예상했던 것과 다른 대규모 기계 코드 명령어로 변환 할 수 있습니다.

관련 문제