我正在研究.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,我还可以作为解决方法?我在设计中做错了什么吗?
的默认值AlarmType
将为0。例如,在此行代码之后
AlaramType alarmType;
值alarmType
是0。但是,由于没有对应的枚举值,因此它现在具有无效值。这就是警告和您声明的原因
我不想添加它,因为这将(1)违反AlarmType的定义(AlarmType不能为None),并且(2)枚举要提供给用户的枚举值时,需要进行额外的检查以排除None选项。
是不正确的。实际上,AlarmType
在分配到之前,所有的实例的值都为0,并且如果您要进行防御性编码,则必须验证该AlarmType
值是否有效。没有为值0定义名称在任何情况下都不会保护您免受AlarmType
变量0的影响,因为它们没有被初始化。
我建议您定义一个0枚举值并调用它Invalid
,None
或者它描述枚举变量尚未初始化的名称。
或者,如果您不想这样做,则可以使用attribute抑制警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句