[英]In C# is default case necessary on a switch on an enum?
我见过与C ++有关的帖子,但我特地要求C#.NET(4.0+)。
在以下示例中是否需要默认情况?
public enum MyEnum : int
{
First,
Second
}
public class MyClass
{
public void MyMethod(MyEnum myEnum)
{
switch (myEnum)
{
case MyEnum.First: /* ... */ break;
case MyEnum.Second: /* ... */ break;
default: /* IS THIS NECESSARY??? */ break;
}
}
}
这是一个常见的误解,即.Net枚举值仅限于枚举中声明的值。 实际上,虽然它们可以是枚举的基本类型范围内的任何值(默认情况下为int
)。 例如,以下内容完全合法
MyMethod((MyEnum)42);
此代码将在没有警告的case
编译,并且不会打开任何case
标签。
现在,您的代码是否选择处理此类方案是一项策略决策。 这不是必要的,但我肯定会建议有一个。 我更喜欢为枚举上的每个switch
添加一个default
,我使用以下模式专门为此场景编写
switch (value) {
...
default:
Debug.Fail(String.Format("Illegal enum value {0}", value));
FailFast(); // Evil value, fail quickly
}
这不是绝对必要的,但有人可能会传入您的枚举未涵盖的值(因为枚举实际上并不限制允许的参数值的范围)。
如果指定的值是意外的,我通常会添加一个默认值并throw
。
这不是技术上必要的,但因为你可以很容易地蒙上了价值MyEnum
的底层类型(通常是int)以实例MyEnum
。 因此,最好在其中添加一个带有Debug.Assert()
的默认语句。
这不是必需的,而是良好的做法,因为有人可能会在以后引入新的枚举。 例如,抛出一个异常,指示未处理“未知”枚举。
不,默认情况不是必需的。
从纯粹的代码角度来看,没有要求具有default
情况。 这完全取决于您的逻辑要求。
如果你将枚举值添加到enum中,则需要使用枚举未定义的值(不会抛出异常)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.