访问非静态成员需要对象引用

13 c# mono

我有一个计时器,我想将计时器回调放入单独的函数,但是,我得到这个错误.

访问非静态字段,方法或属性''需要对象引用...

如果我将这些回调声明为委托事件和成员变量为静态,它可以正常工作.我应该这样离开吗?

class MainClass
{
    private Timer _timer = null;
    private TimeSpan _millisecs;

    public static void Main (string[] args)
    {
        Application.Init();
        MainWindow win = new MainWindow();

        Label lbl = new Label();
        lbl.Text = "00:00";

        Table tbl = new Table(2, 2, true);
        tbl.Name = "tbl";

        Button btn = new Button("Start");
        tbl.Attach(lbl, 0, 2, 0, 1);
        tbl.Attach(btn, 0, 1, 1, 2);
        Button btn_stop = new Button("Stop");
        tbl.Attach(btn_stop, 1, 2, 1, 2);

        btn.Clicked += StartClick;
        btn_stop.Clicked += StopClick;

        win.Add(tbl);
        win.ShowAll();

        Application.Run ();
    }

    private void StartClick(object obj, EventArgs args)
    {
        if (_timer == null) {
            _timer = new Timer();
            _timer.Elapsed += delegate(object sender, ElapsedEventArgs e) {
                _millisecs = _millisecs.Add(new TimeSpan(0, 0, 0, 0, 50));
                lbl.Text = new DateTime(_millisecs.Ticks).ToString("ss:ff");
            };
            _timer.Interval = 50;
            _timer.Enabled = true;                  
        }

        _timer.Start();             
    }

    private void StopClick(object obj, EventArgs args)
    {
        _timer.Stop();          
    }

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 23

这取决于你想要做什么.你可以要么让事情静态的,或者你可以创建一个实例:

MainClass instance = new MainClass();
btn.Clicked += instance.StartClick;
btn_stop.Clicked += instance.StopClick;
Run Code Online (Sandbox Code Playgroud)

我认为这不是你真正的应用程序,因此很难说你应该在真正的代码中做什么.我个人倾向于创建一个实例 - 静态变量代表全局状态,这通常是一个坏主意(在可测性等方面).但我们无法判断这是否会影响您的情况.

重要的是,您了解为什么您收到错误消息以及上述更改为什么会修复它.一旦你理解了这一点,你将处于更好的状态,以做出最好的决定.