switch语句是否保证顺序?

3

我在各种地方看到过,带有字符串 caseswitch 语句有可能被编译器或JIT优化成哈希表以提高性能。 显然,具有非完美哈希函数的哈希表不能保证项目顺序,因此我想知道:

  1. C# 编译器或 JIT 是否可以执行将 switch 语句转换为哈希表以提供常数时间性能的优化?
  2. 在 C# 中,switch 语句是否保证按照从上到下的顺序检查 case

5
它们被检查的顺序不会产生任何明显的影响,那你为什么在意呢?编译器几乎从不对不可观察的行为做出保证。 - CodesInChaos
这不是 C++ 中的 switch - Hamlet Hakobyan
@CodesInChaos 我遇到了一段相当繁琐的代码,其中包含大量带有字符串的switch语句。代码的创建者将两个最常见的选项放在顶部,并认为它们通常会首先被检查,我只是想知道这是否属实。 - Acidic
@CodesInChaos:也许在逻辑上不可观测,但在物理上却是可观测的,因为它可能会改变执行所需的时间。当然,我们不应编写依赖于这种实现相关行为的代码! - Matthew Watson
@MatthewWatson 这基本上就是我的问题 - 这是定义行为还是实现相关? - Acidic
1个回答

3
没有任何保证可以确保顺序得到维护,因为这是纯编译器实现的细节,所以即使现在对于.NET 5.1(假设)来说是真的,也可能是错误的。
switch/case结构用于识别不同可用选项之间的唯一选项。因此,顺序并不重要,如果不考虑性能方面的话,但即使在这方面,它基本上是无关紧要的,而且如果不是这样,由于上述原因,它也无法预测。
因此,不要关注这个问题,而是看看程序的其他部分,如果你正在寻找一些性能瓶颈。

就像我在另一条评论中所说的那样,我只是因为遇到了一段依赖于此来提高性能的代码而感到好奇(尽管无论如何它都微不足道)。我不明白为什么这么多人在SO上回答问题时都觉得需要说“你甚至不应该关心这个!” - Acidic
@Acidic:“你甚至不应该关心”,因为这不是取决于你的事情,所以你没有任何能力影响那种行为。如果你问具体的数字,我没有它们,我从未测量过这个。 - Tigran
如果你在意的话,用if/elseif级联替换switch。 - Matthew Watson
我没有能力影响大多数编程语言的特性,那我不应该关心它们吗? - Acidic
@MatthewWatson 嗯,这就是我问是否switch语句保证顺序的原因。 - Acidic
@Acidic:我理解这个问题是出于好奇,但正如我所说,我手头没有任何具体的数字。 - Tigran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接