问题标签 [switch-statement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
20597 浏览

c - GCC警告“案例标签值超过类型的最大值”是什么意思?

我的代码如下所示:

有什么线索吗?

0 投票
5 回答
7251 浏览

php - Switch 语句和 isset

由于几个月前我的网站充满了通知错误,所以我现在正在尝试修复代码。我想有一些php更新。我对 php 不太了解,所以:

当我添加 isset 时,这将不起作用。

你不能在函数中使用 isset 吗?我真的不知道,所以我问你们知道这些事情的人。

干杯

0 投票
15 回答
40139 浏览

c++ - 为什么选择 Switch/Case 而不是 If/Else If?

这个问题主要指向 C/C++,但我想其他语言也很相关。

我不明白为什么仍然使用 switch/case 而不是 if/else if。在我看来,这很像使用 goto,并导致相同类型的混乱代码,而使用 if/else if 可以以更有条理的方式实现相同的结果。

尽管如此,我还是经常看到这些街区。找到它们的常见位置是在消息循环(WndProc...)附近,而这些是它们引发最严重破坏的地方之一:变量在整个块中共享,即使不合适(并且不能在里面初始化)。必须特别注意不要放弃休息,等等......

就个人而言,我避免使用它们,我想知道我是否遗漏了什么?

它们比 if/else 更有效率吗?它们是按照传统进行的吗?

0 投票
4 回答
6462 浏览

.net - C++/CLI 开启字符串

在其他 .NET 语言(例如 C#)中,您可以打开字符串值:

在 C++/CLI 中似乎并非如此

是否有一个特殊的关键字或其他方法可以使 C++/CLI 像在 C# 中那样工作?

0 投票
9 回答
40018 浏览

c# - 打开枚举(带有标志属性)而不声明所有可能的组合?

我如何打开一个设置了 flags 属性的枚举(或者更准确地说是用于位操作)?

我希望能够在与声明的值匹配的开关中命中所有情况。

问题是,如果我有以下枚举

我想使用这样的开关

如果“theCheckType”同时设置为 CheckType.Form | CheckType.TempData 我希望它同时满足两种情况。显然,由于中断,它不会在我的示例中同时命中,但除此之外它也会失败,因为 CheckType.Form 不等于 CheckType.Form | CheckType.TempData

那么,我可以看到的唯一解决方案是为枚举值的每种可能组合提供一个案例?

就像是

但这真的不是很理想(因为它会很快变得很大)

现在我有 3 个 If 条件紧随其后

就像是

但这也意味着,如果我有一个具有 20 个值的枚举,它必须每次都通过 20 个 If 条件,而不是像使用开关时那样“跳转”到仅需要的“case”/。

有没有什么神奇的方法可以解决这个问题?

我已经想到了遍历声明的值然后使用开关的可能性,然后它只会为每个声明的值点击开关,但我不知道它将如何工作以及它的性能是否是一个好主意(与很多 if 相比)?

有没有一种简单的方法可以遍历所有声明的枚举值?

我只能想出使用 ToString() 并用“,”分割,然后遍历数组并解析每个字符串。


更新:

我发现我解释得不够好。我的例子很简单(试图简化我的场景)。

我将它用于 Asp.net MVC 中的 ActionMethodSelectorAttribute 以确定在解析 url/路由时方法是否可用。

我通过在方法上声明这样的东西来做到这一点

这意味着它应该检查 Form 或 TempData 是否具有为可用的方法指定的键。

它将调用的方法(我之前的示例中的 doSomething()、doSomethingElse() 和 doWhatever())实际上将 bool 作为返回值,并将使用参数调用(不共享接口的不同集合可以是使用 - 请参阅下面链接中的示例代码等)。

为了希望更好地了解我在做什么,我粘贴了一个简单的例子,说明我在 pastebin 上实际做了什么——可以在这里找到http://pastebin.com/m478cc2b8

0 投票
6 回答
1333 浏览

c# - 你会在长开关/枚举声明中使用区域吗?

我最近发现自己需要(是的,需要)在 C# 代码中定义荒谬的长switch语句和enum声明,但我想知道人们认为将它们分成逻辑小节的最佳方式是什么。在我的情况下,枚举值和案例(基于枚举值)都有相当清晰的分组,但我有点不确定如何在代码中反映这一点。

请注意,在我的代码中,我大约有 5 组,每组介于 10 到 30 个枚举值/案例之间。

我可以设想的三个模糊合理的选择是:

  1. 在声明中围绕所有逻辑案例/枚举值组定义#region块(可选用空行分隔)。
  2. 用它的名字评论每个组,在每个组名评论之前有一个空行。
  3. 什么都不做——只需将开关/枚举作为一个巨大的案例/值列表。

你喜欢哪个?你会分别对待枚举和开关吗?(这对我来说似乎有点奇怪。)现在,我不会说这个问题有任何正确/错误的答案,尽管我仍然很想听听意见的普遍共识是什么。

注意 1:由于我正在尝试编写一个词法分析器(标记器),因此我可能有一个非常长的 50/100+ 值的枚举声明的这种情况是不可避免的(并且与开关类似),因此这似乎是最合理的方法有几个原因。

注 2:我完全意识到,关于是否在通用代码中使用区域(主要用于结构化类)的问题已经存在几个重复的问题,但我觉得我的问题在这里更具体,尚未得到解决。

0 投票
7 回答
6900 浏览

java - Java 中枚举值表示的 Switch 语句

我非常熟悉在其他语言中使用 Enums,但是我在 Java 中遇到了一些特殊用途的困难。

枚举的 Sun 文档大胆地指出:

“Java 编程语言的枚举比它们在其他语言中的对应物强大得多,它们只不过是美化的整数。”

好吧,这很花哨,但出于在 switch 语句中进行比较的原因,我需要为每个枚举提供一个常量数据类型表示。情况如下:我正在构建将代表给定空间的节点,或迷宫图中的“槽”,并且这些节点必须能够从代表迷宫的 2D 整数数组构造。这是我为 MazeNode 类获得的内容,目前是问题所在(switch 语句吠叫):

注意:由于 case 语句中的动态项,我知道此代码不起作用。它是为了说明我所追求的。

所以代码用“case 表达式必须是常量表达式”来抱怨 switch 语句——我可以理解为什么编译器可能会遇到问题,因为从技术上讲它们是动态的,但我不确定采取什么方法来解决这个问题。有没有更好的办法?

底线是我需要 Enum 具有相应的整数值,以便与程序中传入的 2D 整数数组进行比较。

0 投票
2 回答
284 浏览

javascript - 使用 switch 语句来处理 irc 服务器代码会很荒谬吗?

有不少IRC服务器代码

我正在为 Adob​​e AIR 开发一个小型 IRC 客户端,我一开始只支持其中的几个,然后一个 switch 语句似乎不是一个坏主意。但是随着我越来越支持,switch语句越来越长,感觉有点失控了。一个问题是我将低级 IRC 处理代码单独保存在一个文件中,以便可以重复使用。我想将所有内容保存在一个文件中。另一个问题是 switch 语句中的代码块目前假定是这个 IRC 类的一部分,并且经常使用这个语句。现在进行更改将需要大量工作并引入回归。唯一的问题是我不喜欢长的 switch 语句,否则你知道它是有效的,而且它很容易阅读,但并没有真正使它更难维护。但这是一个很长的 switch 语句。并且包含 switch 语句的函数显然也很长。://

我有时代替开关做的一件事是我定义了以开关评估的值命名的函数。而不是开关:

我检查范围内是否存在方法并执行它:

但同样在这种情况下,我觉得回归的风险很高,我不确定为了避免冗长的 switch 语句而付出努力是否值得,因为它的长度。

0 投票
11 回答
18437 浏览

java - Java:如果与 Switch

我有一段带有 a) 的代码,我将其替换为 b) 纯粹是为了便于阅读......

一种)

b)


...切换版本会通过所有排列级联还是跳转到一个案例?



编辑:

下面的一些答案是关于上述方法的替代方法。
我已经包括以下内容以提供其使用的上下文。

我之所以问上面的问题,是因为经验性地提高了添加单词的速度。

这无论如何都不是生产代码,并且作为 PoC 被迅速破解。

以下似乎是对思想实验失败的确认。
不过,我可能需要比我目前使用的更大的词库。
失败的原因是我没有考虑仍然需要内存的空引用。 (呸!)

0 投票
3 回答
1038 浏览

ruby - Ruby 一种在条件下执行函数的巧妙方法

作为一个有趣的项目,我正在用 Ruby 实现 Beatnik 解释器。如果您从未听说过 Beatnik,它是一种深奥的编程语言,其中的操作由源代码中单词的“拼字游戏分数”指定。

无论如何,实现需要针对不同的拼字游戏分数进行不同的操作。这不是特别要实现的,一种明显的方法是 if 语句:

另一种方法是使用 case 语句:

但是这两种方法都没有让我觉得特别优雅,你能提出另一种实现方式吗?