MS代码分析规则CA1008的解决方法:枚举应具有零值

时间:2014-02-05 09:19:39

标签: c# .net enums

我正在研究.NET 4.0 / C#项目。我为我的项目启用了一些基本的代码分析规则。我被CA1008击中了。我完全理解为什么CA1008是必要的。

我正在处理的软件与其他设备通信。这些设备是可配置的。配置存储在内部EEPROM中。其中一个配置是AlarmType,在EEPROM中可以具有1到11的值。我已经将警报类型定义如下:

public enum AlarmType
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 3,
    // ...
    Type10 = 10,
    Type11 = 11
}

配置设备时,我允许用户通过使用Enum.GetValues()获取警报值来选择其中一种警报类型。检查EEPROM中的值时,要求如果值为1到11,则显示警报的名称,否则请将其视为Type1

Visual Studio 2010会发出警告,指出AlarmType的值应等于零。我不想添加此内容,因为这会(1)违反AlarmType的定义(AlarmType不能None)和(2)需要额外检查枚举枚举值以向用户显示时排除None选项。

我可以做一个变通方法,而不是抑制CA1008?我的设计中做错了吗?

2 个答案:

答案 0 :(得分:5)

AlarmType的默认值为0.例如在这行代码之后

AlaramType alarmType;

alarmType的值为0.但是,由于没有相应的枚举值,它现在具有无效值。这就是警告和你的陈述的原因

  

我不想添加这个,因为它会(1)违反AlarmType的定义(AlarmType不能是None)和(2)在枚举枚举值时要排除None选项需要额外的检查给用户。

不太正确。事实上,AlarmType的所有实例在分配之前将具有值0,如果您想要进行防御性编码,则必须验证AlarmType是否具有有效值。未定义值0的名称不会以任何方式保护您免受AlarmType变量为0的情况,因为它们未初始化。

我建议您定义一个0枚举值,并将其命名为InvalidNone或描述枚举变量尚未初始化的内容。

或者,如果您不想这样做,可以使用attribute取消警告。

答案 1 :(得分:1)

在你的情况下,你的规则可能更容易添加和例外,但是如果你不想这样做,你可以用0开始枚举并创建一个扩展方法,这将提供正确的EEPROM值这里是可能的扩展方法:

  public static int AsEeprom(this AlarmType etype)
    {
      return ((int)etype) + 1;
    }