问题标签 [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 投票
10 回答
24592 浏览

c# - 这种开关/模式匹配的想法有什么好处吗?

我最近一直在研究 F#,虽然我不太可能很快跳过栅栏,但它肯定突出了 C#(或库支持)可以使生活更轻松的一些领域。

特别是,我正在考虑 F# 的模式匹配功能,它允许非常丰富的语法 - 比当前的 switch/conditional C# 等价物更具表现力。我不会试图给出一个直接的例子(我的 F# 不适合它),但简而言之,它允许:

  • 按类型匹配(对有区别的联合进行全面覆盖检查)[注意这也推断出绑定变量的类型,给予成员访问权限等]
  • 按谓词匹配
  • 以上的组合(可能还有一些我不知道的其他情况)

虽然 C# 最终借用 [ahem] 一些丰富性会很可爱,但在此期间,我一直在研究在运行时可以做什么 - 例如,很容易将一些对象组合在一起以允许:

其中 getRentPrice 是 Func<Vehicle,int>。

[注意 - 也许这里的 Switch/Case 是错误的术语......但它表明了这个想法]

对我来说,这比使用重复 if/else 或复合三元条件(对于非平凡的表达式变得非常混乱 - 大量的括号)的等价物要清楚得多。它还避免了很多转换,并允许简单的扩展(直接或通过扩展方法)到更具体的匹配,例如与 VB Select...Case "x To y 相当的 InRange(...) 匹配“ 用法。

我只是想判断人们是否认为上述结构有很多好处(在没有语言支持的情况下)?

另外请注意,我一直在玩上述的 3 种变体:

  • 用于评估的 Func<TSource,TValue> 版本 - 与复合三元条件语句相当
  • 一个 Action<TSource> 版本 - 相当于 if/else if/else if/else if/else
  • Expression<Func<TSource,TValue>> 版本 - 作为第一个版本,但可由任意 LINQ 提供程序使用

此外,使用基于表达式的版本可以重写表达式树,本质上是将所有分支内联到单个复合条件表达式中,而不是使用重复调用。我最近没有检查过,但在一些早期的实体框架构建中,我似乎记得这是必要的,因为它不太喜欢 InvocationExpression。它还允许更有效地使用 LINQ-to-Objects,因为它避免了重复的委托调用 - 与等效的 C# 相比,测试显示类似上述的匹配(使用表达式表单)以相同的速度 [实际上快一点]复合条件语句。为了完整起见,基于 Func<...> 的版本花费的时间是 C# 条件语句的 4 倍,但仍然非常快,在大多数用例中不太可能成为主要瓶颈。

我欢迎任何关于上述内容的想法/输入/批评/等(或者更丰富的 C# 语言支持的可能性……希望 ;-p)。

0 投票
5 回答
6560 浏览

eclipse - IntelliJ Idea 用户的 Eclipse

我有一位同事希望从 InteilliJ Idea 切换到 Eclipse,并且担心不知道 Eclipse 的命令集。

我想知道 - 有没有人可以链接到可以将 Eclipse 命令设置为至少与 Idea 匹配的键盘映射?

你做过这个开关吗?我们应该注意的任何“陷阱”、提示或信息?

谢谢!

0 投票
13 回答
208935 浏览

c# - C#中的switch语句失败?

switchSwitch 语句失败是我个人喜欢与if/else if构造的主要原因之一。这里有一个例子:

聪明的人之所以畏缩,是因为string[]s 应该在函数之外声明:嗯,他们是,这只是一个例子。

编译器失败并出现以下错误:

为什么?有没有办法在没有三个 s 的情况下获得这种行为if

0 投票
7 回答
800 浏览

algorithm - 树算法

今天早些时候我在想一个小游戏的想法,偶然发现了如何实现它。这个想法是,玩家可以做出一系列动作,产生一点影响,但如果按照特定的顺序进行会产生更大的影响。到目前为止一切顺利,我知道该怎么做。显然,我必须让它变得更复杂(因为我们喜欢让它更复杂),所以我认为序列可能有不止一种可能的路径,它们都会产生更大的影响,尽管是不同的。此外,某些序列的一部分可能是其他序列的开始,甚至整​​个序列可能包含在其他更大的序列中。现在我不确定实现这一点的最佳方法。不过,我有一些想法。

1)我可以实现一个循环n链表。但是由于移动列表永远不会结束,我担心它可能会导致堆栈溢出™。这个想法是每个节点都会有 n 个子节点,并且在收到命令后,它可能会将您带到他的一个子节点,或者,如果没有子节点可用于该命令,则将您带回到起点。到达任何孩子时,都会执行几个功能,从而产生大小影响。但是,这可能会导致树上出现许多重复的节点,以应对所有可能以该特定动作结束并具有不同效果的序列,这可能很难维护,但我不确定。我从来没有在代码上尝试过这么复杂的东西,只是理论上。这个算法是否存在并且有名字?这是个好主意吗?

2)我可以实现一个状态机。然后,我不会在链表中徘徊,而是有一些巨大的嵌套开关来调用函数并相应地更新机器状态。似乎实现起来更简单,但是......好吧......看起来并不有趣......也不优雅。巨型开关在我看来总是丑陋,但这会更好吗?

3) 建议?我很好,但我很缺乏经验。编码领域的好处是,无论你的问题多么奇怪,过去有人解决了它,但你必须知道去哪里找。有人可能有比我更好的主意,我真的很想听听建议。

0 投票
12 回答
154607 浏览

coding-style - 切换语句失败...应该允许吗?

从我记事起,我就一直避免使用 switch 语句。实际上,我不记得它曾经作为一种可能的做事方式进入我的意识,因为它很早就被钻进我的脑海,它只不过是 switch 语句中的一个错误。然而,今天我遇到了一些设计使用它的代码,这让我立刻想知道社区中的每个人都对 switch 语句失败的看法。

它是编程语言明确不允许的(就像 C# 一样,尽管它提供了一种解决方法)还是任何语言的功能强大到足以留在程序员手中?

编辑: 我对失败的意思不够具体。我经常使用这种类型:

但是,我担心这样的事情。

这样,只要 case 为 0, 1,它就会在 switch 语句中执行所有操作。我在设计上看到了这一点,我只是不知道我是否同意应该以这种方式使用 switch 语句。我认为第一个代码示例非常有用且安全。第二种似乎有点危险。

0 投票
3 回答
45505 浏览

c++ - switch case vs if else

I was wondering if there was any difference in the way the following code was compiled into assembly. I've heard that switch-case is more efficient than if else, but in this example I am not quite sure if that would be the case.

and

0 投票
4 回答
24801 浏览

makefile - 在 Makefile 中进行“切换”的好方法

我正在工作中尝试更新的构建系统;目前,我正在尝试找到一种根据目标平台设置编译器和标志的好方法。

我想做的是

GNU Make 不支持。现在,我的第一个想法是做

这是一个相当不错的解决方案,但是,很难了解文件之间的差异,更不用说我期待编写和维护一个好的 60-80 个文件,每个文件都包含一组变量定义.

有没有人碰巧知道更好的方法来做到这一点?即基于另一个变量设置一组标志和其他选项?

0 投票
13 回答
678804 浏览

sql - 'where' 子句中的 SQL 切换/大小写

我尝试四处寻找,但找不到任何可以帮助我的东西。

我正在尝试在 SQL 中执行此操作:

我知道我不应该把'= @locationID'放在每一个的末尾,但我无法得到接近正确的语法。SQL 在第一行 WHEN 上一直抱怨我的“=”...

我怎样才能做到这一点?

0 投票
12 回答
307051 浏览

php - 如何在 PHP 中使用 switch case 'or'

有没有办法在 PHP 开关中使用“或”运算符或等效运算符?

例如,像这样:

0 投票
7 回答
62540 浏览

c# - C# switch 语句中的变量声明

为什么在C# switch 语句中,一个变量在多个情况下使用,你只在第一种情况下声明它?

例如,以下会引发错误“已在此范围内定义了名为 'variable' 的局部变量”。

但是,根据逻辑,如果类型为 ,则不应命中初始声明Type.B。switch 语句中的所有变量是否都存在于单个范围内,它们是否在处理任何逻辑之前创建/分配?