我知道这是一个非常常见的错误 - 但作为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()
函数之前,不应引用类中的对象。
答案 0 :(得分:6)
将InitializeComponent()
调用移到构造函数的开头。
InitializeComponent
方法包含设计器生成的所有初始化逻辑,包括您正在使用的btnX
和lblHeader
控件的初始化。
答案 1 :(得分:1)
我知道你已经有了答案,但只是一个小小的补充:
我的理解是,当您尝试引用非静态对象时,就会发生此错误,就像它是静态对象一样。我在思考正确的方向吗?
不是真的。这只是意味着由于错位的InitializeComponent()
,对象引用尚未初始化。如果你用静态声明的变量尝试相同的东西,你会得到同样的东西。
如果您声明了一个静态方法,并且尝试在该静态方法的上下文中访问某个成员,那么您将收到错误
非静态字段,方法或属性“成员”
需要对象引用
无论如何:为Patko +1:)