怎么"切换"编译?

时间:2017-08-02 13:00:18

标签: c# .net switch-statement cil

与C#提供的相比,CIL中的use操作码非常有限。如果参数等于标签的索引,它接受一个包含标签序列的跳转表,以跳转到哪里。因此,与C#不同,您只能打开一个非负整数,并且仅适用于从0到n的所有情况。

另一方面,C#开关可用于字符串甚至负数。

我已经完成了一些测试,对于字符串,似乎采用了简单的switch平等,所以尽管普遍认为==并不比switch / {{1更快}} 在这种情况下。 if调用else if,它进行序数比较(即按字节顺序)。

此外,如果案例似乎是#34;足够顺序",则会将其编译为真正的==操作码。编译器甚至如此聪明,它找到最小的情况并从值中减去它,从而有效地使案例从0开始。

如果在顺序范围之外的某些情况下,它会将它们转换为正常比较,但保持开关。如果开关中存在间隙,则会使它们指向下一条指令(Equals)。

所以我想知道编译器在C#中编译switch语句时所考虑的完整规则是什么?它何时决定将其转换为default:操作码,何时仅转换为正常比较?

修改:看起来switch中包含大量字符串,它会将它们缓存在静态switch中。

0 个答案:

没有答案