【发布时间】:2026-02-06 14:05:02
【问题描述】:
在性能方面,使用枚举而不是字符串数组是否更有效?
我决定测试一个特定的方法 IsDefined,而不是检查字符串数组中的匹配。我创建了一个 Stopwatch 对象来测试每个对象的运行时间。
代码如下:
在 Main 类之外定义了一个枚举:
enum Color : byte { red, blue, green }
内部主要:
string[] colArr = new string[] { "red", "blue", "green" };
string input = "green";
Stopwatch s1 = new Stopwatch();
int loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
foreach (var blah in colArr)
if (blah == input)
break;
s1.Stop();
Console.WriteLine("Runtime for foreach loop: {0}", s1.Elapsed);
loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
if (Enum.IsDefined(typeof(Color), input))
continue;
s1.Stop();
Console.WriteLine("Runtime for IsDefined method returned value: {0}", s1.Elapsed);
我的输出如下所示:
Runtime for foreach loop: 00:00:01.4862817
Runtime for IsDefined method returned value: 00:00:09.3421654
Press any key to continue . . .
所以我想问一下——假设我写的代码不是愚蠢的或什么——这些数字是正常的,如果它们是正常的,那么使用枚举比使用字符串数组更可取的方式是什么,特别是对于什么样的工作都可以?
【问题讨论】:
-
两者都有自己的目的。您将枚举用于开发人员友好的 API,并将字符串用于用户输入。您的研究表明了什么?
-
您正在使用像字符串一样的枚举,当然效率较低。而是将其存储为
Color,例如:Color input = Color.green;。那么你就不需要检查它是否存在了。 -
Enum.IsDefined(typeof(Color), input)的调用可能会伪造您的计算,因为它需要解析字符串并进行一些拆箱。您可以使用Enum.GetValues等同于foreach(var blah in colArr)以获得更合适的结果。 -
@TimSchmelter 我之前没有澄清这一点,但这是如何工作的,要求用户输入颜色,然后程序检查该颜色是否存在。我决定跳过输入部分,而是将字符串“green”放在输入中。所以输入类型是字符串是不可避免的,我不能将它存储在颜色中,而不先检查它是否存在,因此调用 IsDefined。
-
@ChenLeikehmacher:两件事:1)为用户提供一个下拉列表或
ColorDialog。然后你不需要检查它是否存在。 2)你问错了问题。用户只给你一个输入,你正在测量 100000000Enum.IsDefined呼叫。在这种情况下,性能是您最不应该关心的事情。