将枚举强制转换为其值是有价值的情况

本文关键字:有价值 情况 枚举 转换 | 更新日期: 2023-09-27 18:26:52

我的一个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) {...}
}

两者之间的区别是什么,以及在哪些场景中我必须键入价值和使用,使用上述任何一种是否有任何性能提升,或者两者相同?

将枚举强制转换为其值是有价值的情况

当您决定稍后更改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或其他可能发生的情况不会对性能造成影响。

我只能想象,如果您从代码外部读取_modifcationType,即:从文件、数据库、JSON等读取,则需要进行强制转换。

除此之外,我会在不进行强制转换的情况下使用它,特别是在switch..case块中。

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

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

话虽如此,您应该尽可能使用实际的Enum值。使用枚举的全部目的是为整数提供有意义的值。如果代码库新手看到第一个例子,他们不会知道代码在做什么。如果他们看看第二个,它实际上仍然是有意义的。

两个样本应该运行相同的程序。不过,出于可读性的考虑,我建议使用第二个。它比第一个更容易理解和维护。

后半部分:如果对值进行数学运算,则可能需要从枚举进行强制转换,而且这种情况很少见,因为枚举会自动转换为相应的整数类型。

使用枚举值。命名枚举值(如ModificationType.Delete)是一个编译时常数。

除非你需要做其他事情:

  • 未定义枚举(0)的默认值,或者将其定义为未知或类似:

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

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

我最喜欢的MS Word错误之一是在Word中做一些事情,遇到一个弹出的MessageBox,上面有一个OK按钮和一条神秘的消息:"这个消息永远不应该出现"。这并不完全有用,但开发人员的心是对的。