【发布时间】:2013-04-30 16:13:39
【问题描述】:
我们正在查看我们的代码以尝试识别高 CPU 使用率,并且我正在查看我们使用 while 循环的几个区域。我想在下面显示的代码中冒无限循环的风险,但我不确定最好的解决方案是什么。
IDictionaryEnumerator codeEnumerator = Resources.Error_Codes.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true).GetEnumerator();
IDictionaryEnumerator messageEnumerator = Resources.Error_Messages.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true).GetEnumerator();
bool codeDone = false;
bool messageDone = false;
while (codeEnumerator.MoveNext() && !codeDone)
{
string value = codeEnumerator.Value.ToString();
if (value == failedResponse.Code.ToString())
{
key = codeEnumerator.Key.ToString();
codeDone = true;
}
}
while (messageEnumerator.MoveNext() && !messageDone)
{
if (messageEnumerator.Key.ToString() == key)
{
message = messageEnumerator.Value.ToString();
messageDone = true;
}
}
【问题讨论】:
-
请在下次格式化您的代码时更加小心,尽可能避免水平滚动。让代码从屏幕的一半开始是没有意义的。
-
您是担心序列是无限序列,还是担心即使序列是有限的代码也会永远运行?
-
被枚举的每个资源集中的资源都是有限的。在上面的代码中,它们甚至不可能成为无限循环,但我想确定一下。
-
首先让代码正确。我在该代码中没有看到任何 Dispose() 调用。 您需要处理枚举数;如果你不这样做,那么迭代器块中的 finally 块将永远不会运行。我会考虑重写这个不正确的代码以使用序列运算符;这将使代码正确、更短、更易于阅读。
-
此外:您为什么要通过循环搜索字典? 字典的全部意义在于您可以直接搜索它,这就是它被称为字典的原因。无限循环是您遇到的最少的问题;此代码存在严重缺陷。
标签: c# infinite-loop enumerator