C# 使用事件处理程序声明并初始化ToolStripMenuItem

C# 使用事件处理程序声明并初始化ToolStripMenuItem,c#,winforms,event-handling,C#,Winforms,Event Handling,我有一个ToolStripMenuItem,我想用一个字符串、一个图像的空值和一个Click事件的事件处理程序来声明和实例化它。这是Intellisense期望的格式: ToolStripMenuItem(string text, System.Drawing.Image image, EventHandler onClick). 但是我无法分配事件处理程序,并且我不知道这样做的正确语法。作为一种解决方法,我在构造函数中指定.Click事件,如下所示 class Timer { //T

我有一个ToolStripMenuItem,我想用一个字符串、一个图像的空值和一个Click事件的事件处理程序来声明和实例化它。这是Intellisense期望的格式:

ToolStripMenuItem(string text, System.Drawing.Image image, EventHandler onClick).
但是我无法分配事件处理程序,并且我不知道这样做的正确语法。作为一种解决方法,我在构造函数中指定.Click事件,如下所示

class Timer
{
    //The other WinForms objects and my methods are omitted.
    private ToolStripMenuItem StartButton = new ToolStripMenuItem("Start Timer");

    public Timer()
    {
        //I want the assignment of StartButton_Click in my declaration and initialization of StartButton, not here.
        StartButton.Click += new EventHandler(StartButton_Click);
    }

    public void StartButton_Click(object sender, EventArgs e)
    {
        //The logic here is not relevant.
    }
}
我尝试了下面的语法,但不断出现错误: CS0236字段初始值设定项无法引用非静态字段、方法或属性“Timer.StartButton\u Click(object,EventArgs)”

Intellinse建议我使用这种格式

EventHandler(void(object,EventArgs)target)

但我不知道如何填写预期的语法属性。如何编写StartButton声明,以便在单击事件后调用StartButton\u Click方法?

实例化它的正确位置在构造函数中。一次完成所有操作,如下所示:

private ToolStripMenuItem StartButton;

public Timer()
{
    StartButton = new ToolStripMenuItem("Start Timer", null, StartButton_Click);
}
至于那个编译器错误,您可以,尽管它的详细信息很少。

From:您不能使用实例变量初始化另一个实例变量。为什么?因为编译器可以重新排列这些,所以不能保证在开始按钮单击之前初始化提醒,所以上面的一行可能会抛出NullReferenceException


将该方法设置为静态,您应该可以继续使用。

只要该方法不包含非静态变量,您的解决方案就会非常有效。现在我知道了答案,这并不重要。我在自学,并不总是知道什么是最佳实践。当Intellisense建议使用方法签名(字符串、图像、EventHandler)时,我只是假设您可以在构造函数之外执行该操作。
private ToolStripMenuItem StartButton;

public Timer()
{
    StartButton = new ToolStripMenuItem("Start Timer", null, StartButton_Click);
}