3

我知道这是一个非常常见的错误——但是作为一个 C# 新手,我发现通过查看其他帖子很难找到问题的原因,因为问题很模糊并且可以应用于很多场景。因此,为什么我要开始自己的问题。希望通过这样做我可以更多地了解错误,所以我希望你们不要介意。

据我了解,当您尝试引用非静态对象时会发生此错误,就好像它是静态对象一样。我的想法是否正确?

我的问题是这样的:我正在尝试创建自己的自定义对话框(而不是使用标准的 winforms)。所以我有以下代码:

public partial class Dialog : Form
{
    public Dialog(string header, string msg, bool closeable, int buttons)
    {
        if (!closeable)
            btnX.Hide();
        if (header != null || header != String.Empty)
            lblHeader.Text = header;
        if (msg != null || msg != String.Empty)
            lblMessage.Text = msg;
        InitializeComponent(); //Problem is here, this should be at the top.
    }

    private void btnX_Click(object sender, EventArgs e)
    {
        Close();
    }
}

我正在Dialog使用以下行调用此类:

Dialog dlg = new Dialog("HEADER", "HELLO", true, buttonChoice);
dlg.ShowDialog();

但我得到了Object reference not set to an instance of an object上线:

lblHeader.Text = header; (而且我想我也会在“消息”行中得到它)。

有人可以告诉我我在这里做错了什么吗?谢谢!

更新答案InitializeComponent():在调用函数之前不应引用类中的对象。

4

2 回答 2

6

InitializeComponent()调用移动到构造函数的开头。

InitializeComponent方法包含设计器生成的所有初始化逻辑,包括您正在使用的控件的初始化btnX和初始化。lblHeader

于 2013-03-16T13:54:34.517 回答
1

我知道您已经有了答案,但只是补充一点:

据我了解,当您尝试引用非静态对象时会发生此错误,就好像它是静态对象一样。我的想法是否正确?

并不真地。这仅仅意味着对象引用由于放错位置而尚未初始化InitializeComponent()。如果你用静态声明的变量尝试同样的事情,你会得到同样的事情。

如果您声明一个静态方法并尝试在该静态方法的上下文中访问成员,那么您会收到错误

非静态字段、方法或属性“成员”需要对象引用

无论如何:Patko +1 :)

于 2013-03-16T14:00:50.910 回答