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

10

对于 ReSharper 6.1,C# 中没有内置的检查缺失 switch 的默认语句的检查项,但自定义模式似乎总体上很健壮。我已经在一些情况下尝试了它们,例如 if 块中缺少 else 语句,但不确定如何检查缺少默认值。

这是我目前拥有的内容:

搜索模式

switch($expr$)
{
    case $val$:
        $statement$
        break;
    $missingDefault$
}

替换模式

switch($expr$)
{
    case $val$:
        $statement$
        break;
    default:
        break;
}

这里存在以下问题:

  • 我们可以有任意数量的情况,它们本身是由一个或多个语句(case + break等)和任意数量的表达式组成的集合
  • 对于搜索模式匹配,我们应该只匹配最后一个case之后没有内容的情况(即没有default)
  • 我们需要在搜索模式中加入'break',以便我们可以定义此后语句不存在。不管怎样,编译器都要求加上这个break。

显然,这种搜索模式只匹配包含单个case和没有default的情况,因此相对无用。我需要一种能够匹配带有任意数量的情况、其中任何一个情况可能包含或不包含break(除了最后一个case),并且可以包含任意数量的语句,但没有default的模式。

感谢您的帮助。


2
只是想澄清一下,你在添加“空的”默认 break语句的目的是什么? - wal
考虑到您的替换代码将导致Resharper将其标记为“冗余空默认开关分支”,请注意。 - wal
重点是要有一个默认值,这样至少有一个基准。Resharper将其标记为冗余是可以的,因为在断点之前提供逻辑过于依赖上下文。 - jropella
我认为设置一个空的默认值可以被视为至少考虑到了这种情况。尽管这让我想到,在这种情况下什么都不做是否合适,也许抛出一个适当的异常会更好。 - Gorgsenegger
2个回答

1

我已经尽力了,但我认为目前不可能实现(Resharper 7)

话虽如此,您始终可以在 Resharper 论坛上提问

我能提供的唯一可能有用的东西是查找以下模式:

1)所有开关语句

switch($expr$)
    $statement$

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

switch($expr$)
{
    $statement$
    default:
    break;
}

你可以使用这两个列表的差异来确定哪些没有 default;break; 语句。例如,在我的项目中,第一个列表有231个实例,而第二个列表只有58个。

我意识到这远离了你想要的(不是替换!),但这是我能做到的最好的。


0

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

也许Visual Studio查找和替换可以帮助您使用选项使用<强>正则表达式


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