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

时间:2011-08-09 07:20:36

标签: 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();          
    }

}

2 个答案:

答案 0 :(得分:23)

这取决于你想要做什么。你可以 使事情变得静态,你可以创建一个实例:

MainClass instance = new MainClass();
btn.Clicked += instance.StartClick;
btn_stop.Clicked += instance.StopClick;

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

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

答案 1 :(得分:1)

这是因为在这种情况下你从静态访问非静态方法。

创建类的对象,然后调用方法

ObjectOfClass obj = new ObjectOfClass();
obj.MethodName();

所以在你的情况下

MainClass obj = new MainClass();
btn.Clicked += obj.StartClick;
btn_stop.Clicked += obj.StopClick;

或者将被调用的方法创建为静态(您已按照自己的意思尝试过)。