4

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

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

log.RegisterEvent(eventType, userID, eventDetails);

有些事件是系统事件,它们没有关联用户 ID。由于用户 ID 是正整数,我认为 0 表示该事件不参考用户:

log.RegisterEvent(eventType, 0, eventDetails);

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

enum UserID
{
    None = 0
}

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

4

6 回答 6

8

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

一个常数值会更有意义:

const long UnknownUserId = 0;

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

于 2012-08-08T09:56:15.860 回答
5

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

于 2012-08-08T09:56:06.220 回答
3

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

“魔术”常数的想法对我来说也不是很吸引人。

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

所以将第二个参数更改为 type 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>
于 2012-08-08T12:16:41.200 回答
1

将用户变量声明为静态常量:

static const int NoneUserID = 0;
于 2012-08-08T09:56:51.743 回答
1

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

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

于 2012-08-08T09:58:19.007 回答
0

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

于 2012-08-08T09:56:05.043 回答