当值得将枚举转化为其价值时的情景

时间:2012-03-05 19:42:37

标签: c# casting enums

我在我的一个Windows应用程序中有枚举,如下所示:

private enum ModificationType
{
    Insert = 0,
    Update = 1,
    Delete = 2
}

我有以下功能:

private void UpdateDatabaseTransactions(ModificationType _modifcationType)
        {
int modType = (int)_modifcationType;
if (modType == 0) {...}
if (modType == 1) {...}
if (modType == 2) {...}

我也可以像下面这样使用它:

if (_modifcationType == ModificationType.Insert) {...}
if (_modifcationType == ModificationType.Update) {...}
if (_modifcationType == ModificationType.Delete) {...}
}

两者之间以及在哪种情况下我必须对值和使用进行类型划分有什么区别,使用上述任何一种方法是否有任何性能提升器,或两者都相同?

7 个答案:

答案 0 :(得分:6)

当您决定稍后更改ModificationType枚举时会发生什么?例如:

private enum ModificationType
{
    Insert = 0,

    /* Oops, need a special insert type here */
    InsertSpecial = 1,

    Update = 2,
    Delete = 3
}

诚然,这是一个人为的例子。 (但肯定不是不可能的 - 假设您的enum用于引用一些引入重大变化的外部依赖,例如C API。)

但是如果按值引用这些枚举类型,则必须追踪它们的所有引用。你想拖拽你的代码试图弄清楚数字3是用于引用枚举还是其他一些随机常数?

相反,您应该使用ModificationType.Delete,这样您就不必担心这些问题。毕竟,这就是enum类型存在的原因。

使用ModificationType.Delete而不是4,5,6或其他可能发生的任何事情都没有性能损失。

答案 1 :(得分:4)

如果从代码外部读取_modifcationType,我只能想象你需要强制转换(来自)的场景 - 即:来自文件,数据库,JSON等。

除此之外 - 我会在没有投射的情况下使用它 - 特别是在switch..case块中。

答案 2 :(得分:3)

将枚举实例与特定值进行比较时,应始终使用指定的枚举值。使用ModificationType.Insert0编辑/更改更安全。编辑值不会影响使用ModificationType.Insert的现有比较,但会静默地导致依赖它的函数的行为为0.

答案 3 :(得分:3)

它们几乎相同(假设您使用的整数值实际上与您在枚举中使用的值匹配)。你不会注意到两者之间的性能差异。

话虽这么说,你应该尽可能使用实际的枚举值。使用Enum的重点是为整数赋予有意义的值。如果对代码库不熟悉的人看第一个例子,他们就不会知道代码在做什么。如果他们看第二个,它实际上仍然是有意义的。

答案 4 :(得分:3)

两个样本应该运行相同。我建议使用第二个,因为可读性。理解和维护比第一个容易得多。

答案 5 :(得分:1)

下半部分:如果你对值进行数学运算,你可能需要从枚举中转换,也很少因为枚举被自动转换为相应的整数类型。

答案 6 :(得分:1)

使用枚举值。与ModificationType.Delete类似的命名枚举值是编译时常量。

除非您需要做其他事情:

  • enum(0)的默认值是undefined,或者define是Unknown或类似的东西:

    public enum ModificationType
    {
     [ Unknown = 0 , ]
     Insert = 1 ,
     Update = 2 ,
     Delete = 3 ,
    }
    
  • 当您使用if / then语句执行某些操作时,请使用开关并为超出范围的值抛出InvalidOperationException或类似的异常。当enum的域扩展时,这将保存您的培根(或其他人的),或者您有一个错误,其中枚举实例未正确初始化为正确的值:

    switch ( someModificationType )
    {
    case ModificationType.Insert : performInsert() ; break ;
    case ModificationType.Delete : performDelete() ; break ;
    case ModificationType.Update : performUpdate() ; break ;
    default :
      throw new InvalidOperationException() ;
      break ;
    }
    

我最喜欢的MS Word错误之一就是在单词中做一些事情并遇到一个弹出的MessageBox,其中有一个OK按钮和一个神秘的消息:“此消息永远不会出现”。不完全有用,但开发人员的心脏在正确的位置。