C#的switch語句可以編譯爲CIL開關指令,或者if/else,這取決於所述語句中的情況,如here所述。有沒有辦法強制編譯器總是在代碼塊中生成if/else變體?如何通過生成CIL開關指令來停止C#的switch語句
回答
最簡單的方法是在代碼中使用if/else。除此之外,這使得讀者更清楚,這就是你想要發生的事情,而不是使用開關。
編輯:好吧,所以可讀性對你並不重要 - 但基本上如果你想編譯的代碼改變,源代碼將不得不改變。您可以使用Mono編譯器並自行修改它,但我懷疑是否有任何方法讓Microsoft編譯器有效地忽略您正在使用switch語句。
switch語句由詞法分析器生成,因此可讀性不受關注。重寫發生器產生if/else's是最後的手段:) – user55017 2009-04-18 11:02:44
您是否嘗試了不同的編譯器(即單聲道),或試圖將您的違規類放在單獨的程序集中並切換爲其他語言?
你如何讓編譯器做到這一點? 我與VS2008測試:
public static int DoSomething(int i) {
switch (i) {
case 1: return 0;
case 100: return 1;
case 1000: return 2;
default: return 3;
}
}
編譯爲:
.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
}
沒有開關指示在那裏。
也許你應該向微軟提交一個錯誤?
我沒有編譯器可用的ATM,但如果爲值爲1-1000的3個case開關創建了跳轉表,我會感到震驚(因此1000項)。可能與案例1更接近:案例50: – user55017 2009-04-18 12:16:48
不,您無法控制C#編譯器如何發出CIL指令。即使可以,AOT或JIT編譯器也可能將CIL指令翻譯爲本地機器代碼指令,這些指令與您預期的高級編譯器優化相比會有很大不同。
- 1. 通過switch語句循環
- 2. c switch語句
- 3. 程序在開關語句C語言中停止工作
- 4. 如何在開關語句後停止程序關閉
- 5. 打開switch語句
- 6. NG-開關按鈕steatment switch語句
- 7. 「可選」生成器在switch語句中?
- 8. 使用JavaPoet生成switch語句
- 9. 通過switch語句中的一類
- 10. C++ INT switch語句
- 11. 如何防止未來的開發者濫用`switch``default`子句?
- 12. 如何通過上下文停止Python中的語句執行?
- 13. C++開關語句
- 14. 如何打開的if else語句switch語句
- 15. 通過switch語句落(作品有時?)
- 16. IF語句轉換成SWITCH語句
- 17. Objective-C的switch語句
- 18. C#的switch語句重構
- 19. C#:switch語句的問題?
- 20. C++中的switch語句
- 21. 模擬器/生成的開關語句範圍c
- 22. switch語句中的switch語句?
- 23. C++如何避免case/switch語句
- 24. 開關語句循環通過
- 25. C# - 語句在switch語句中
- 26. 如何使用枚舉生成switch語句框架
- 27. 如何在Visual Studio代碼上生成switch語句標籤?
- 28. 如何通過javascript中的switch語句調用函數
- 29. CIL的邏輯指令
- 30. 如何停止/終止ultralite SELECT語句?
你爲什麼要這樣做? – ilivewithian 2009-04-18 10:46:30