c# - 在 C# 中使用 if/else 和 switch-case 之间有什么显着区别吗?

标签 c# .net switch-statement

在 C# 中使用 switch 语句与使用 if/else 语句有什么好处/坏处。除了代码的外观之外,我无法想象会有那么大的不同。

是否有任何原因导致生成的 IL 或相关的运行时性能会截然不同?

相关:What is quicker, switch on string or elseif on type?

最佳答案

SWITCH 语句仅在调试或兼容模式下生成与 IF 相同的程序集。在发布时,它将被编译成跳转表(通过 MSIL 'switch' 语句)- 这是 O(1)。

C#(与许多其他语言不同)也允许打开字符串常量 - 这有点不同。为任意长度的字符串构建跳转表显然是不切实际的,因此大多数情况下这种开关将被编译到 IF 堆栈中。

但是,如果条件的数量足以覆盖开销,C# 编译器将创建一个 HashTable 对象,用字符串常量填充它并在该表上进行查找,然后跳转。哈希表查找不是严格的 O(1) 并且具有明显的常数成本,但是如果 case 标签的数量很大,它会比比较 IF 中的每个字符串常数快得多。

总而言之,如果条件的数量超过 5 个左右,则优先使用 SWITCH 而不是 IF,否则使用看起来更好的任何东西。

关于c# - 在 C# 中使用 if/else 和 switch-case 之间有什么显着区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/395618/

相关文章:

c# - 为什么 HashSet<Point> 比 HashSet<string> 慢这么多?

c# - 仅当从网络驱动器进行编译时,编译问题[“Root activity type is invalid”]

java - 枚举的详尽 switch 语句的静态分析

在多种情况下具有相同值的 PHP switch 语句

ios - 使开关功能正常工作

c# - System.ComponentModel.Win32Exception (0x80004005) : No such interface supported

c# - 在 C# 中以编程方式打开位于计算机中的 Word 文档

C#:交换 winform 控件的正确方法是什么?

c# - F# 2.0 中的错误与泛型类型参数的约束在哪里有关?

c# - 为什么不能将属性作为 out 参数传递?