C# 我是否应该假设两个元素枚举将保持这种方式?

C# 我是否应该假设两个元素枚举将保持这种方式?,c#,syntax,enums,switch-statement,if-statement,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

我经常使用两个成员的枚举:

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

我真的不知道应该如何标记,如果需要,请毫不犹豫地重新标记


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

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

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

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

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

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

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

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


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

从维护的角度来看,我会将第一个选项视为一个潜在的bug,并将其转化为一个案例语句,以使行为更加明确。我想这取决于代码的预期寿命——它停留的时间越长,您应该做得越明确。

从维护的角度来看,我会将第一个选项视为一个潜在的错误,并将其转化为一个案例陈述,以使行为更加明确。我想这取决于代码的预期寿命——它停留的时间越长,您应该做得越明确。

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

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

@Jon:我知道错误处理有什么变化。为了简洁起见,我想知道是否可以放弃错误处理。这完全取决于情况。如果在您自己的代码中调用该方法,并且您知道该方法的值已经有效,那么不验证参数是合理的。如果它被其他代码调用,您可能应该验证它。我可能会在做其他事情之前就这么做。@Jon:我知道错误处理会有什么变化。为了简洁起见,我想知道是否可以放弃错误处理。这完全取决于情况。如果在您自己的代码中调用该方法,并且您知道该方法的值已经有效,那么不验证参数是合理的。如果它被其他代码调用,您可能应该验证它。不过,我可能会在做其他事情之前先这么做。
int i = (int) e;