1

我发现了一段代码应该会产生错误,因为数组超出了界限,但它的行为却很奇怪。当我踏入它时,它会在 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);
    }
4

1 回答 1

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;
        }

    }

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

编辑:附加说明,这似乎只LoadForm. 如果此代码在其他地方,它会在正常调试时中断(假设您的 Visual Studio 设置为在 CLR 异常上中断)。

关于这个问题的更多信息来自伟大的 Hans Passant:为什么表单加载不能捕获异常?

并在此博客文章中深入了解答案:http: //blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode- x64 中的回调异常/

于 2013-06-21T01:17:25.090 回答