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 ループの動作

さらに奇妙なのは、この動作をもう一度再現できなかったことです。

NB:今日、this.CreateGraphics();私のコードは次のようなもので、似たようなことを経験しました:

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

その結果、4回再実行しようとしても描画に失敗し、コードに戻ってdcを明示的に定義しました.voilaは機能していました。その後、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 に答える