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

时间:2009-03-06 16:25:26

标签: c# syntax enums switch-statement if-statement

发生了很多事情,我有两个成员枚举:

        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#中发布了代码,但这个问题与语言无关。

我真的不知道应该如何标记,如果需要,请不要犹豫。

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果值被添加到枚举中,那么将语句添加到switch语句会比任何其他语句更容易。

答案 2 :(得分:1)

问题确实语言相关,因为不同的语言处理枚举的方式不同。

由于错误处理,第一个版本与其他两个版本非常不同。如果你真的不在乎如果它既不是A也不是B会发生什么,只需使用(在这种情况下):

int i = (int) e;

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

答案 3 :(得分:0)

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