检查 switch 语句中是不是缺少默认情况

Posted

技术标签:

【中文标题】检查 switch 语句中是不是缺少默认情况【英文标题】:Check for missing default case in switch statement检查 switch 语句中是否缺少默认情况 【发布时间】:2012-08-08 14:33:04 【问题描述】:

对于 ReSharper 6.1,对于 C# 的 switch 中缺少默认语句,没有内置检查项,但是自定义模式看起来通常很健壮。对于缺少 if 块的 else 语句等情况,我对它们进行了一些处理,但我不确定如何检查缺少的默认值。

这是我目前所拥有的:

搜索模式

switch($expr$)

    case $val$:
        $statement$
        break;
    $missingDefault$

替换模式

switch($expr$)

    case $val$:
        $statement$
        break;
    default:
        break;

其中 $expr$ 是一个表达式,$val 是一个表达式,$statement$ 是任意数量的语句,$missingDefault$ 是最多 0 个语句。

这里的问题如下:

我们可以有任意数量的 case,它们本身就是一个由一个或多个语句(case + break 等)和任意数量的表达式组成的集合 对于搜索模式匹配,我们应该只匹配在最后一种情况之后没有任何内容的情况(即没有默认值) 我们需要在搜索模式中使用“中断”,以便我们可以在之后定义不存在的语句。无论如何,编译器需要这个中断。

显然,这种搜索模式只匹配包含单一大小写且没有默认值的匹配项,因此相对无用。我需要一个模式来匹配具有任意数量的情况的开关,其中任何数量可能包含也可能不包含中断(最后一种情况除外)并且可以包含任意数量的语句,并且没有默认值.

感谢您的帮助。

【问题讨论】:

只是为了澄清,您添加“空”默认值的目的是什么:break;声明? 鉴于您的替换代码意味着 Resharper 会将其突出显示为 Redundant empty default switch branch 关键是要有一个默认值,这样至少有一个基线。 resharper 会将其标记为冗余这一事实很好,因为它过于依赖上下文而无法在中断之前提供逻辑。 我认为有一个空的默认值可以被看作是至少考虑过它可能发生的一种方式。虽然这让我觉得在这种情况下“什么都不做”是否很好,但也许抛出一个适当的异常会更好。 【参考方案1】:

我对此有很好的了解,但我认为目前不可能(Resharper 7)

话虽如此,您可以随时在Resharper forum上提问

我唯一能提供的可能有任何用处的就是找到的模式

1) 所有 switch 语句

switch($expr$)
    $statement$

2)以default; break结尾的switch语句:

switch($expr$)

    $statement$
    default:
    break;

然后您可以使用这两个列表的差异来确定哪些列表缺少default;break; 语句。例如,在我的项目中,第一个出现了 231 次,第二个出现了 58 次。

我意识到这与您想要的相比很长的方式(没有替换!)但它是我能做到的最好的。

【讨论】:

【参考方案2】:

我认为 ReSharper 的搜索模式是不可能的。 (请注意,default 可以放在 case 语句之间。)

也许 Visual StudioFind and Replace 可以帮助您选择 Use Regular expressions .

【讨论】:

以上是关于检查 switch 语句中是不是缺少默认情况的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个简单的switch语句总是运行默认

C语言switch语句的理解

为啥 switch 语句上有奇怪的缩进?

Android检查int是不是在区间+ switch语句中

下划线符号是不是会忽略或检查 Swift 中 switch 语句中的无效性?

switch语句是否应该包含默认子句?