我不确定我是否理解 if 块和 switch/select 块之间的区别。我的意思是我一直在使用它们。但是我不清楚什么时候应该应用 switch 块,什么时候不应该。因为,选择块可以扩展为 if 块。因此,我能想到的使用 select 块的唯一真正优势是人类可读性。
5 回答
答案会因语言而异。例如,在 C 和 C++ 中,switch
(select) 语句可以被编译器转换为相当有效的跳转表,部分原因是它们比if
语句条件更具限制性。(尽管公平地说,现代编译器非常擅长优化各种东西。)这可能不适用于所有语言/编译器(我似乎记得 VB6 基本上被Select Case
视为一系列If/ElseIf
语句。)
可读性绝对是一个因素:使用 a switch
(或Select Case
在 VB 中)告诉任何跟随你的人,下面的所有分支都在一个共同条件下分支,这非常有用。
可维护性(与可读性相关但不同)也是一个因素。如果您更改 a 中分支的一件事switch
,您就完成了;如果你有一连串的if
陈述,很容易漏掉一个(或多个)。
一个 switch 块几乎需要以下内容:
- 您只有一个标准要调查,或者有几个相互不依赖的标准
- 您有多个(即超过 2 或 3 个)预定义分支
- 您想搜索平等,例如“day == Days.Monday”
如果您想同时检查多个相互依赖的标准,如果您只有一个分支(或者可能是两个小分支),或者如果您想搜索不等式(例如“时间 > 8.00”),则 if 语句是要走的路。
可以说,我列表中的第一点可以使用各种“漂亮”技术来规避,但根据我的经验,这仅相当于复杂且难以阅读的代码 - 正如 TJ 所说,可读性是编写可维护代码时的一个因素。
所以我能想到的使用 select 块的唯一真正优势是人类可读性..
不要小看这一点。在编程中,人类可读性应该是默认的第一要务。
取决于我想的语言,但假设你在谈论 C。在 C 中,switch-block 将转换为跳转表,因此你将根据值直接跳转到你想要执行的部分,而 if 块可以进行任意比较,并且必须将其与每个可能的值进行比较以找到要执行的分支。
请注意,开关只能使用设置值(跳转表是在编译时创建的),而 if 块可以进行小于/大于比较或与变量的比较。
如果要比较多个项目,则需要使用 if 块。您可以使用 if/elseif/else。如果您想对一个变量的值做出反应,您将使用 switch/select 块。
if (today is monday) {
it is moday.
} else if (today is tuesday and it is 8:00pm) {
it was not monday but it is tuesday and it is 8:00pm.
} else {
it must be sunday.
}
switch (day) {
case: Monday
it is monday
case: Tuesday
it is tuesday
}