繁体   English   中英

在C#中是否需要枚举开关上的默认情况?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM