Visual Studio 2010中的错误/奇怪的For-Loop行为?

时间:2012-10-31 19:54:33

标签: c# visual-studio-2010 debugging

当我的应用程序现在触发了IndexOutOfRanage异常时,我感到很震惊。我打开了 Debugger Locals Pane ,发现我的整数越过了它的边界?基本上我的代码中有这样的东西:

string folder = Extender.GetSetting<string>("textFolder");
string mlink = folder + "\\" + filename + ".txt";
if(File.Exists(mlink))
{
    string fContent = File.ReadAllText(mlink);
    rtbLearnGuide.Text = fContent;
    string[] strings = fContent.Split(' ');
    for (int i = 0; i < strings.Length; i++, words.Enqueue(strings[i]));
}

这里的问题是我达到了strings[]的长度,我附上了一张图片。

Weird For-Loop behaviour

更奇怪的是,我第二次无法重现这种行为。

注意:我今天早些时候遇到类似this.CreateGraphics();的问题我的代码如下:

var dc = this.CreateGraphics();//and some other stuff

结果是,即使在尝试重新运行4次之后也无法绘制它,然后我回到代码并明确定义了dc,瞧它正在工作。然后我把它改回了var,它还在工作:/?

可能出现什么问题?

修改

我刚刚发现改变订单有效。例如:

for (int i = 0; i < strings.Length; words.Enqueue(strings[i]), i++);

不会触发任何错误。

2 个答案:

答案 0 :(得分:6)

要回答问题的第一部分,您将在 for循环的测试条件之前执行Enqueue 。所以

for (int i = 0; i < strings.Length; i++, words.Enqueue(strings[i]));

应该是:

for (int i = 0; i < strings.Length; i++) words.Enqueue(strings[i]);

基本上,“增量”部分将始终在“测试”部分之前执行。

答案 1 :(得分:5)

以逻辑方式格式化for循环,您将不会遇到该错误。

for (int i = 0; i < strings.Length; i++)
    words.Enqueue(strings[i]);

在你的代码中,“i”增加超过条件(strings.Length)你正在运行word.Enqueue on a of bounds“i”。

你的循环(伪代码):

i = 0
Loop_Label:
IF i >= strings.Length THEN GoTo End_Label
... where the for loop body should go ...
i = i + 1
words.Enqueue strings[i]
GoTo Loop_Label
End_Label: