1

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

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[],我在下面附上了一张图片。

奇怪的 For 循环行为

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

注意:我今天早些时候经历了类似的事情,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++);

不会触发任何错误。

4

2 回答 2

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]);

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

于 2012-10-31T19:59:34.687 回答
5

逻辑地格式化你的 for 循环,你不会有那个错误。

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

在您的代码中,“i”在超出条件(strings.Length)之后递增,然后您在越界“i”上运行 word.Enqueue。

您的循环(在伪代码中):

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:
于 2012-10-31T19:59:23.057 回答