所以我有
public enum Type
{
Cat,
Dog,
Horse,
}
private void SomeFunc(Type type)
{
switch (type)
{
case Type.Cat:
// ...
break;
case Type.Dog:
// ...
break;
default:
throw new System.Exception();
}
}
Run Code Online (Sandbox Code Playgroud)
假设一开始我们只有猫和狗。而且我们已经写了数百万个使用switch(type)的func,例如SomeFunc。
现在我们介绍了Horse,因此我将把Horse应用于每个开关。
但是其他工作分支中的人并不知道这一增加。并且当它们的分支合并为master时,将在交换机中包含一些不包含Horse的func。
好吧,如果以后我们对每种类型进行单元测试,我们都可以获取异常,但我们负担不起。
如果我们可以检查所有情况是否都在每个开关(枚举)中明确列出,那将是完美的。有任何想法吗?甚至有可能(不包裹)?
不,这是不可能的-至少不是开箱即用。C#中的switch语句不必是穷举的,也没有办法要求它们是穷举的。
(如果C#8中的switch 表达式不够详尽,则会发出警告,但现在可能对您没有帮助。)
您可以 为此编写一个Roslyn分析器。如果您之前写过罗斯林分析仪,那我认为它是微不足道的。如果您以前没有编写过Roslyn分析器,则可能需要花费相当长的时间,尽管这是一项有趣的工作。
或者,使用第三方Roslyn分析仪。我刚刚找到了一个似乎可行的工具,但没有深入研究它。这是一个例子:
项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Roslyn.Analyzers" Version="1.0.3.4" PrivateAssets="All" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
码:
using System;
enum Color
{
Red, Green, Blue
}
sealed class Program
{
static void Main(string[] args)
{
Color c = Color.Red;
switch (c)
{
case Color.Red:
Console.WriteLine("Red");
break;
case Color.Green:
Console.WriteLine("Green");
break;
// case Color.Blue:
// Console.WriteLine("Blue");
// break;
default:
Console.WriteLine("Undefined color");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Program.cs(14,9):警告ENUM0001:添加缺少的开关盒。如果开关缺少枚举的可能值或默认情况,则认为该开关不完整。
我不能保证质量,您可能要配置启用该软件包中的哪些分析仪,但事实证明这是可能的。可能还有其他分析仪在做同样的事情-这只是我发现的第一个搜索结果。