【问题标题】:CA1008: Enums should have zero value and Flag enumsCA1008:枚举应该有零值和标志枚举
【发布时间】:2014-03-27 14:39:48
【问题描述】:

即使我完全了解 CA1008 警告存在的原因,我也不知道如何在以下情况下避免它。我有一个具有以下含义的标志枚举:

ValidValue = 0x01
WrittenValue = 0x02

所以在这种情况下,0 表示 InvalidValueNonWritten 而不是 None。规则says

除了以前发布的标志属性枚举之外,不要禁止来自此规则的警告。

在这种情况下,我没有发送枚举,那么如何防止出现此警告?

编辑:

警告明确表示:

警告 86 CA1008:Microsoft.Design:在枚举“XXX”中,将“XXX.InvalidValueNonWritten”的名称更改为“None”。

编辑 2:

枚举的更多状态:

CommandValue = 0x04 // Otherwise it is DataValue
InmediateValue = 0x08 // Otherwise it is Deferred

【问题讨论】:

  • 为什么没有 InvalidValueNonWritten 为 0?这不是枚举的默认状态吗?
  • 是什么阻止您提供合理的零值?
  • @NoviceProgrammer:检查编辑。规则说 0 应该是 None 可能是为了模拟空值(未设置)。
  • @DanielJamesBryars:检查编辑。规则说 0 应该是 None 可能是为了模拟空值(未设置)。
  • 枚举名称与编码的 FxCop 规则无关,但它可以为试图帮助您的人提供相关信息。 ;)

标签: c# .net enums fxcop enum-flags


【解决方案1】:

在这个特定的时刻,0 值具有“无效或写入”的含义。但是,如果您添加更多枚举成员,情况将不再如此。例如,如果您添加ApprovedValue = 0x04,0 将开始表示“无效或书面或批准”。这是始终为 0 值使用 None 名称的主要原因。

如果 None 作为名称没有意义,这通常表明枚举设计或名称存在缺陷。在您的情况下,听起来枚举实际上代表该值已通过的 steps,而不是值的 state (标志枚举通常不会使用)。以下可能是您想要的更接近的表示(其中关联的类可能有一个名为 CompletedValueProcessingSteps 之类的属性)?

[Flags]
enum ValueProcessingSteps
{
    None = 0,
    Validation = 1,
    Writing = 2
}

【讨论】:

  • 首先感谢您的尝试,我很感激。第二个猜测不正确,它们是完全不同的状态,没有连续的状态。一个值可以同时处于这些状态中的多个状态,我知道 0 应该是“未设置”,但是我应该找到一种方法来表示当前由 0 表示的值。无论如何,我认为任何标志enum 也会有同样的问题,0 总是有“none”以外的意思,你不觉得吗?
  • 我添加了更多状态以更清楚地表明这是一个标志枚举。
  • 我没有假设这些步骤是连续的,我也没有建议使用非标志枚举。我只是没有在示例代码上显示FlagsAttribute。如果“步骤”名称困扰您,只需将其从名称中删除即可。如果“处理”不相关,请尝试找到与您的使用方式相关但仍符合“无”0 零值的名称。 (也就是说,您在更新中添加的项目让我怀疑这些项目不应该都在一个枚举中。)
  • 对不起,我明白你的意思了。它只是一个不同的命名模式,将导致具有有效的 None 值。我会检查谢谢。
【解决方案2】:

如果 0 表示 InvalidValueNonWritten,则将 InvalidValueNonWritten 添加到枚举中。那么这个警告就不会发生。如果您真的不应该在枚举中包含 0,请在代码中抑制警告,并确保将理由放入以供将来参考。

如果您预计由于 0 无效而出现异常,最好使用枚举在您的方法中执行验证。这对于序列化也更好,例如,如果您在模型上使用序列化,则模型将使用源中缺少的成员进行反序列化。

【讨论】:

  • 我已经这样做了,警告还是会发生。规则说该值应该是 None 而不是任何东西。请检查编辑。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多