C# 将枚举强制转换为其值是有价值的场景
我的一个windows应用程序中有如下枚举: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
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,你可以在这里参考他的答案:,他说不知道为什么,但我最近发现这个“功能”非常有用。前几天我写了这样的东西“