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

Don*_*alo 3 .net c# 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
}
Run Code Online (Sandbox Code Playgroud)

在配置设备时,我允许用户通过使用获取警报值来选择其中一种警报类型Enum.GetValues().检查EEPROM中的值时,要求就像是从1到11的值,然后显示警报的名称,否则请考虑它Type1.

Visual Studio 2010会发出警告,指出AlarmType应该具有等于零的值.我不想添加这个,因为它会(1)违反AlarmType(AlarmType不能)的定义,None并且(2)None在枚举枚举值以呈现给用户时,需要额外的检查来排除选项.

而不是抑制CA1008,我可以做什么作为一种解决方法?我的设计中做错了吗?

Mar*_*age 5

默认值为AlarmType0.例如,在这行代码之后

AlaramType alarmType;
Run Code Online (Sandbox Code Playgroud)

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

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

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

我建议你定义一个0枚举值并调用它Invalid或者None描述枚举变量尚未初始化的东西.

或者,如果您不想这样做,可以使用属性禁止警告.