Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将枚举强制转换为其值是有价值的场景_C#_Casting_Enums - Fatal编程技术网

C# 将枚举强制转换为其值是有价值的场景

C# 将枚举强制转换为其值是有价值的场景,c#,casting,enums,C#,Casting,Enums,我的一个windows应用程序中有如下枚举: private enum ModificationType { Insert = 0, Update = 1, Delete = 2 } if (_modifcationType == ModificationType.Insert) {...} if (_modifcationType == ModificationType.Update) {...} if (_modifcationType == Modificatio

我的一个windows应用程序中有如下枚举:

private enum ModificationType
{
    Insert = 0,
    Update = 1,
    Delete = 2
}
if (_modifcationType == ModificationType.Insert) {...}
if (_modifcationType == ModificationType.Update) {...}
if (_modifcationType == ModificationType.Delete) {...}
}
我有以下功能:

private void UpdateDatabaseTransactions(ModificationType _modifcationType)
        {
int modType = (int)_modifcationType;
if (modType == 0) {...}
if (modType == 1) {...}
if (modType == 2) {...}
我也可以像下面那样使用它:

private enum ModificationType
{
    Insert = 0,
    Update = 1,
    Delete = 2
}
if (_modifcationType == ModificationType.Insert) {...}
if (_modifcationType == ModificationType.Update) {...}
if (_modifcationType == ModificationType.Delete) {...}
}

两者与我必须键入值并使用的场景之间有什么区别?使用上述任何一种方法是否有任何性能提升,或者两者相同?

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

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


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

两个样本的运行方式应相同。但我建议使用第二个,因为可读性。它比第一个更容易理解和维护。

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

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没有性能损失。请删除
而不是4、5、6或任何可能发生的内容。

如果您从代码外部阅读
\u ModificationType
,即从文件、数据库、JSON等,我只能想象您需要从中转换


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

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

使用枚举值。命名枚举值,如
ModificationType.Delete
是编译时常量

除非您有其他需要,否则:

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

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

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

我最喜欢的MS Word bug之一是在Word中做了一些事情,遇到了一个带有OK按钮的弹出消息框和一条神秘的消息:“此消息永远不会出现”。不完全有用,但开发人员的想法是正确的。

我相信
enum
s的最佳实践是0有一个错误状态,对于未初始化的
enum
si得到了一个答案,因此,@johnny g说,在开关中不使用case,你可以在这里参考他的答案:,他说不知道为什么,但我最近发现这个“功能”非常有用。前几天我写了这样的东西“