有一个单值的枚举是正确的吗?

时间:2012-08-08 09:54:17

标签: c# enums

这是一个非常简单的问题,但我真的很想知道什么是好的做法。

我有一个包含日志记录子系统的系统。日志包含有关用户ID的信息。简化的日志记录如下:

log.RegisterEvent(eventType, userID, eventDetails);

某些事件是系统事件,但它们没有关联userID。由于用户ID是正整数,我认为0意味着事件不会给用户:

log.RegisterEvent(eventType, 0, eventDetails);

但是把0放在那里只是......不对。我想过使用枚举,比如:

enum UserID
{
    None = 0
}

但是只有一个值的枚举可以吗? 最好使用静态常量? 或者它是另一种更好的方式?

6 个答案:

答案 0 :(得分:8)

“用户ID”对我来说听起来不像是一种自然的枚举。这并不像全球范围内有一组天生的用户。

恒定值会更有意义:

const long UnknownUserId = 0;

的情况,其中具有单个值的枚举是有意义的,但它几乎总是用于未来的扩展。

答案 1 :(得分:5)

最好使用常量 - 否则你必须在使用时强制转换枚举值,因为API确实需要一个数字。枚举用于封闭的值集,用户ID不属于此类别。

答案 2 :(得分:3)

我不喜欢你的枚举,因为大多数开发人员都不会期望使用(UserIDEnum)42,因为它不是"定义的"枚举类型的值。

还有一个"魔法"常数不是很吸引我。

对于可以为空的类型来说,这似乎是一个明显的例子,即int?(也称为Nullable<int>)。大多数开发人员都会理解,如果int?为空(HasValue为false),则表示没有用户ID,如果是42,则表示该用户ID。

因此,请将第二个参数更改为int?。和电话看起来像这样:

log.RegisterEvent(eventType, null, eventDetails);    // no user ID in this case
log.RegisterEvent(eventType, userID, eventDetails);  // variable userID is automatically "lifted" from int to Nullable<int>

答案 3 :(得分:1)

将用户变量声明为static const:

static const int NoneUserID = 0;

答案 4 :(得分:1)

更改日志记录子系统以定义不带用户ID的重载。

在那个重载中你可以只编码0,因为它现在是唯一可以使用的地方。

答案 5 :(得分:0)

是的,当没有多样性时,使用枚举是什么。