我应该假设双元素枚举将保持这种状态吗?

Should I assume two-elements enums will remain this way?

提问人:Brann 提问时间:3/7/2009 最后编辑:Brann 更新时间:4/29/2009 访问量:129

问:

我经常发生我有一个两个成员的枚举:

        enum  E{
            A,
            B
        }

假设我想根据我的枚举值为 i 分配一个不同的值。

我应该写这个:

        int i= (e== E.A)?0:1;

或者这个:

        int i;
        if (e==E.A)
            i=0;
        else if (e==E.B)
            i=1;
        else throw new NotImplementedException("Unknown enum member for E : " + e);

或者也许是这样的:

        int i;
        switch (e)
        {
            case E.A:
                i = 0;
                break;
            case E.B:
                i=1;
                break;
            default:
                throw new NotImplementedException("Unknown enum member for E : " + e);
        }

我通常会选择第一种选择,因为它写得更快,但我总是觉得有点不对劲。你平时做什么?

我用 c# 发布了代码,但这个问题与语言无关。

我真的不知道应该如何标记它,如果需要,请随时重新标记它。

编辑:也许我的问题还不够清楚:我真正想知道的是:我应该假设我的枚举永远不会改变并走快路,还是应该考虑它可能会改变(尽管我还没有改变它),并添加一些错误处理代码,这样我就不会花费数周时间跟踪错误在哪里(如果它发生了变化)

C# 语法 枚举 switch-statement if-statement

评论


答:

1赞 Jason 3/7/2009 #1

如果将值添加到枚举中,则向 switch 语句添加语句比其他任何语句都容易。

1赞 Jon Skeet 3/7/2009 #2

这个问题确实与语言有关,因为不同的语言以不同的方式处理枚举。

由于错误处理,第一个版本与其他两个版本有很大不同。如果你真的不在乎如果它既不是 A 也不是 B 会发生什么,只需使用(在本例中):

int i = (int) e;

如果您想要的 int 值不直接匹配,我要么使用 switch 语句,要么甚至可能使用字典(这会更慢,但使用 C# 3.0 集合初始值设定项的代码更紧凑,并且如果您对它抛出的异常感到满意,将免费提供参数检查)。

评论

0赞 Brann 3/7/2009
@Jon : 我知道错误处理有什么变化。我想知道为了简洁起见是否可以放弃错误处理。
0赞 Jon Skeet 3/7/2009
这完全取决于具体情况。如果在您自己的代码中调用该方法,并且您知道该值已有效,则不验证参数是合理的。如果它是由其他代码调用的,则可能应该进行验证。不过,我可能会在其他事情之前这样做。
3赞 marijne 3/7/2009 #3

从维护的角度来看,我会将第一个选项视为潜在的错误,并将其转换为案例语句以使行为更加明确。我想这取决于代码的预期寿命 - 它存在的时间越长,你应该越明确。

0赞 M. Jahedbozorgan 4/29/2009 #4

最后一个是最佳实践。它更具可读性和可维护性。 请不要使用第一个!