与C#提供的相比,CIL中的use
操作码非常有限。如果参数等于标签的索引,它接受一个包含标签序列的跳转表,以跳转到哪里。因此,与C#不同,您只能打开一个非负整数,并且仅适用于从0到n的所有情况。
另一方面,C#开关可用于字符串甚至负数。
我已经完成了一些测试,对于字符串,似乎采用了简单的switch
平等,所以尽管普遍认为==
并不比switch
/ {{1更快}} 在这种情况下。 if
调用else if
,它进行序数比较(即按字节顺序)。
此外,如果案例似乎是#34;足够顺序",则会将其编译为真正的==
操作码。编译器甚至如此聪明,它找到最小的情况并从值中减去它,从而有效地使案例从0开始。
如果在顺序范围之外的某些情况下,它会将它们转换为正常比较,但保持开关。如果开关中存在间隙,则会使它们指向下一条指令(Equals
)。
所以我想知道编译器在C#中编译switch
语句时所考虑的完整规则是什么?它何时决定将其转换为default:
操作码,何时仅转换为正常比较?
修改:看起来switch
中包含大量字符串,它会将它们缓存在静态switch
中。