循环遍历数组的数组时没有错误?

时间:2013-06-21 01:10:30

标签: c# winforms

我发现了一段应该产生错误的代码,因为数组越界,但它的表现很奇怪。当我进入它只是在4个循环后停止并且不添加控件。怎么会这样,没有错误或编译器警告或什么?

    Panel[] panel = new Panel[4];
    Label[] label = new Label[4];
    private void Form1_Load(object sender, EventArgs e)
    {
        for (int x = 0; x < 20; x++)
        {
            label[x] = new Label { Name = x.ToString("00"), BackColor = Color.Blue, Text = "Test" };
            panel[x] = new Panel { Name = x.ToString("00"), BackColor = Color.Blue };
        }
        tableLayoutPanel1.Controls.AddRange(label);
        tableLayoutPanel2.Controls.AddRange(panel);
    }

1 个答案:

答案 0 :(得分:3)

如果将代码包装在try-catch中,您将看到抛出的异常。我的猜测是,当不存在try-catch时,Form会抛出并吞下异常。

    void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            for (int x = 0; x < 20; x++)
            {
                label[x] = new Label { Name = x.ToString("00"), BackColor = Color.Blue, Text = "Test" };
                panel[x] = new Panel { Name = x.ToString("00"), BackColor = Color.Blue };
            }
            this.Controls.AddRange(label);
            this.Controls.AddRange(panel);
        }
        catch (Exception ex)
        {
            this.Text = ex.Message;
        }

    }

另外,正如评论者所指出的,编译器不会进行编译时数组边界检查。

编辑:附加说明,在Load的{​​{1}}事件处理程序中似乎只需要这样做。如果此代码除此之外的其他地方,则在正常调试时会中断(假设您的Visual Studio设置为在CLR异常时中断)。

来自伟大的Hans Passant的更多关于这个问题:Why the form load can't catch exception?

在这篇博客文章中,最后得到答案:http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/