我正在开发一个 .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。但是,由于没有相应的枚举值,因此它现在具有无效值。这就是警告和你的陈述的原因



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

我建议您定义一个 0 枚举值并将其称为 InvalidNone 或描述枚举变量尚未初始化的东西。

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

关于c# - MS 代码分析规则 CA1008 : Enums should have zero value 的解决方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21573020/

10-13 01:49