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

我有一个计时器,我想将计时器回调放入单独的函数中,但是,出现此错误。


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


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


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();          

    }


}


烙印99
浏览 477回答 2
2回答

斯蒂芬大帝

这取决于您要执行的操作。你可以要么让事情静态的,或者你可以创建一个实例:MainClass instance = new MainClass();btn.Clicked += instance.StartClick;btn_stop.Clicked += instance.StopClick;我认为这不是您的真实应用程序,因此很难说出您应该在真实代码中执行的操作。我个人倾向于创建实例-静态变量表示全局状态,通常这是一个坏主意(就可测试性而言)。我们无法确定这是否会影响您的情况。重要的是要了解为什么会收到错误消息以及上述更改为何可以解决该错误消息。了解了这一点之后,您将可以更好地制定最佳决策。

犯罪嫌疑人X

这是因为在这种情况下,您要从静态方法访问非静态方法。创建类的对象,然后调用方法ObjectOfClass obj = new ObjectOfClass();obj.MethodName();所以你的情况MainClass obj = new MainClass();btn.Clicked += obj.StartClick;btn_stop.Clicked += obj.StopClick;或将调用的方法创建为静态方法(已按您的说明尝试过)。
打开App,查看更多内容
随时随地看视频慕课网APP