5

根据 System.Enum 类的 MSDN 文档的最佳实践部分:

不要仅仅为了反映枚举本身的状态而定义枚举值。例如,不要定义仅标记枚举结束的枚举常量。如果您需要确定枚举的最后一个值,请明确检查该值。此外,如果范围内的所有值都有效,您可以对第一个和最后一个枚举常量执行范围检查。

如果我理解正确,我们不应该如下声明枚举。

public enum DrawOrder
{
    VeryBottom = 0,
    Bottom = 1,
    Middle = 2,
    Top = 3,
    Lowest = VeryBottom, //marks a position in the enum
    Highest = Top, //marks a position in the enum
}

为什么这被认为是不好的做法?

4

4 回答 4

2

我不确定我是否同意这是不好的做法;这取决于。

Steve McConnell 的Code Complete使用了这种结构。(这本书开始显示它使用的语言的时代,所以这种技术在当时可能是很好的实践。)

不利的一面是,如果您更新枚举列表,还需要记住一件额外的事情:如果需要,更新Highestand/or的值Lowest。如果你忘记了,你会引入错误。

好处是你为循环编写的代码更快并且可以自我记录。

于 2012-09-14T18:23:20.033 回答
2

因为如果你添加VeryTop = 4到枚举中,你必须记住更新Highest.

如果你不这样做,所有的地狱都会崩溃。经过一段时间(几个月)后,很容易忘记这一点。

于 2012-09-14T18:24:01.783 回答
2

因为这些值可能会随着时间而改变。假设您将一个属性设置为(使用您的示例)DrawOrder.Highest并将其存储在您的数据库/文档/其他数据接收器中。

时间流逝。

代码更改。

您的DrawOrder枚举已获得更多值,并且您的持久数据中的值现在不再等于DrawOrder.Highest. 它仅等于DrawOrder.Highest数据被持久化时所映射的内容。

您认为这种情况有可能引起问题吗?

于 2012-09-14T18:24:24.403 回答
1

我想说,如果您坚持枚举并且枚举可能会改变,那只是一个坏主意。如果你不坚持它,或者枚举没有改变的机会,那么在大多数情况下它可能没问题。但是标记的全部意义在于它的值可能会改变......所以它真的没有任何意义。

但是,在使用这样一种结构时需要小心,因为他们使用了他们实际想要的枚举。如果您的意思是 Top,但使用 Highest 代替...然后添加 SuperTop 并将 Highest 更改为此,那么您的初衷现在可能是一个错误。

仅当您想使用最高或最低的值时,才应使用 Marker 枚举,而不管其值如何。

很多人认为这是不好的做法,因为当你想要一个特定的值时使用标记真的很容易。

于 2012-09-14T18:31:33.390 回答