将枚举强制转换为其值是有价值的情况
本文关键字:有价值 情况 枚举 转换 | 更新日期: 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.Insert
比0
更安全地进行编辑/更改。对值的编辑不会影响使用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按钮和一条神秘的消息:"这个消息永远不应该出现"。这并不完全有用,但开发人员的心是对的。