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;