提问人:Brann 提问时间:3/7/2009 最后编辑:Brann 更新时间:4/29/2009 访问量:129
我应该假设双元素枚举将保持这种状态吗?
Should I assume two-elements enums will remain this way?
问:
我经常发生我有一个两个成员的枚举:
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# 发布了代码,但这个问题与语言无关。
我真的不知道应该如何标记它,如果需要,请随时重新标记它。
编辑:也许我的问题还不够清楚:我真正想知道的是:我应该假设我的枚举永远不会改变并走快路,还是应该考虑它可能会改变(尽管我还没有改变它),并添加一些错误处理代码,这样我就不会花费数周时间跟踪错误在哪里(如果它发生了变化)
答:
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
最后一个是最佳实践。它更具可读性和可维护性。 请不要使用第一个!
评论