C# 스위치 명령문은 here과 같은 명령문의 경우에 따라 CIL 스위치 명령이나/else 명령문으로 컴파일 할 수 있습니다. 컴파일러가 항상 코드 블록에서 if/else 변형을 생성하도록 강제하는 방법이 있습니까?C#의 switch 문에서 CIL 스위치 명령을 생성하는 것을 중지하는 방법
답변
가장 간단한 방법은 코드에서 if/else를 사용하는 것입니다. 다른 점을 제외하고는 스위치를 사용하는 대신 이을 원한다는 것을 독자에게 분명히 알립니다.
편집 : 좋아, 가독성은 중요하지 않지만 기본적으로 컴파일 된 코드를 변경하려면 소스 코드를 변경해야합니다. Mono 컴파일러를 사용하여 직접 수정할 수도 있지만 switch 구문을 사용하고 있다는 사실을 Microsoft 컴파일러에서 무시하도록하는 방법은 없습니다.
switch 문은 어휘 분석기에서 생성되므로 가독성은 중요하지 않습니다. if/else 's가 최후의 수단 인 생성기를 다시 작성 :) – user55017
다른 컴파일러 (예 : 모노)를 사용해 보셨습니까? 아니면 문제가있는 클래스를 별도의 어셈블리에 배치하고 다른 언어로 전환하려고하셨습니까?
어떻게하면 컴파일러가 이렇게할까요? 내가 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에 버그를 신고해야합니까?
컴파일러를 사용할 수있는 ATM이 없다. 그러나 점프 테이블이 값 1 - 1000 (예 : 1000)로 작성되면 충격을받을 것이다. 항목). 아마도 case 1에 가까워 진 것 같습니다 : case 50 : – user55017
그렇지만 나는 컴파일러가 자신의 경우에도 최적의 코드를 선택하지 않았다면 놀랄 것입니다. 3 가지 경우 만 20 가지의 IL 지침이 배출되었습니다. – erikkallen
컴파일러는 실행 속도에 맞는 최적의 코드를 선택합니다. 메모리 사용을 최적화하고 싶습니다. 20 IL 명령은 여전히 50-100 항목 점프 테이블보다 훨씬 적은 메모리를 사용합니다. – user55017
아니요, C# 컴파일러에서 CIL 명령어를 방출하는 방법을 제어 할 권한이 없습니다. 그리고 가능하다해도 AOT 또는 JIT 컴파일러는 CIL 명령어를 고급 컴파일러 최적화로 인해 예상했던 것과 다른 대규모 기계 코드 명령어로 변환 할 수 있습니다.
- 1. 예상 식 전에 ... 스위치 문에서
- 2. switch 문에서 문자열의 끝을 확인하십시오.
- 3. switch/case 문에서 JavaScript 변수 범위는 무엇입니까?
- 4. switch 문에서 무작위로 대문자를 선택하는 방법
- 5. C# Switch 문에서 IgnoreCase를 사용하는 방법
- 6. switch 문에서 기본 NotImplementedException을 throw합니다.
- 7. switch 문에서 참조가 선언되는 시점은 언제입니까? 놀랍게도
- 8. switch 문에서 변수 선언 및 초기화
- 9. 함수를 javascript, jquery에서 실행하는 것을 중지하는 방법?
- 10. 데이터베이스 프로젝트를 빌드하는 것을 중지하는 방법
- 11. LINQ-C의 스위치 케이스 선택과 같은 #
- 12. C에서 일시 중지하는 방법?
- 13. 클릭 이벤트를 자바 스크립트 기능에서 실행하는 것을 중지하는 방법?
- 14. Java 질문 : 다른 스위치 내에서 switch 문을 사용할 수 있습니까?
- 15. C# 스위치 문답 질문
- 16. 스위치
- 17. 대화 메시지가 닫힐 때까지 다른 명령을 일시 중지하는 방법
- 18. Switch 문에서 Cmd Line Argument에 TCHAR *를 어떻게 사용합니까?
- 19. 플래시 as3 - case/switch 문에서 스택 오버플로 오류가 발생했습니다.
- 20. JavaScript switch 문에서 엄격한 비교를 수행하는 것이 안전합니까?
- 21. switch 문에서 1 개의 case 만 작동합니다 (Objective C)
- 22. 조작 방법 찾기 .Net CIL 런타임에서
- 23. JS 스위치, 숫자를 늘리는 방법?
- 24. switch 문에 대한 도움말
- 25. 레일즈 생성 명령을 사용하여 2 개의 모델을 생성하는 방법
- 26. jQuery Switch Case Plugin?
- 27. 안드로이드에서 AsynchTask를 중지하는 방법?
- 28. 스트리밍 모드에서 플래시로 mp3 파일을 다운로드하는 것을 중지하는 방법
- 29. Qt qmake - 대상을 삭제하는 규칙을 추가하는 것을 중지하는 방법
- 30. 스트리밍 된 Comet 통신을 브라우저에서 버퍼링하는 것을 중지하는 방법
왜 그렇게하고 싶습니까? – ilivewithian