我正在研究.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?我的设计中做错了吗?
答案 0 :(得分:5)
AlarmType
的默认值为0.例如在这行代码之后
AlaramType alarmType;
alarmType
的值为0.但是,由于没有相应的枚举值,它现在具有无效值。这就是警告和你的陈述的原因
我不想添加这个,因为它会(1)违反AlarmType的定义(AlarmType不能是None)和(2)在枚举枚举值时要排除None选项需要额外的检查给用户。
不太正确。事实上,AlarmType
的所有实例在分配之前将具有值0,如果您想要进行防御性编码,则必须验证AlarmType
是否具有有效值。未定义值0的名称不会以任何方式保护您免受AlarmType
变量为0的情况,因为它们未初始化。
我建议您定义一个0枚举值,并将其命名为Invalid
或None
或描述枚举变量尚未初始化的内容。
或者,如果您不想这样做,可以使用attribute取消警告。
答案 1 :(得分:1)
在你的情况下,你的规则可能更容易添加和例外,但是如果你不想这样做,你可以用0开始枚举并创建一个扩展方法,这将提供正确的EEPROM值这里是可能的扩展方法:
public static int AsEeprom(this AlarmType etype)
{
return ((int)etype) + 1;
}