Ссылка на объект требуется для доступа к нестационарному элементу

У меня есть таймер, и я хочу поставить обратные вызовы таймера однако я получаю эту ошибку.

Ссылка на объект требуется для доступа к нестатическому полю, методу или свойству ''...

Если я объявляю эти обратные вызовы как делегированные события и переменные-члены как статические, он работает нормально. Должен ли я оставить это таким образом?

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

}

Ответ 1

Это зависит от того, что вы пытаетесь сделать. Вы можете сделать вещи статичными или создать экземпляр:

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

Я предполагаю, что это не ваше реальное приложение, поэтому трудно сказать, что вы должны делать в своем реальном коде. Лично я склоняюсь к созданию экземпляра - статические переменные представляют собой глобальное состояние, которое обычно представляет собой плохую идею (с точки зрения проверки и т.д.). Мы не можем сказать, влияет ли это на вашу ситуацию или нет.

Важно то, что вы понимаете, почему вы получаете сообщение об ошибке и почему это изменение исправляет. Как только вы это поймете, вы будете в лучшей ситуации, чтобы принимать наилучшие решения.

Ответ 2

Это потому, что в этом случае вы получаете доступ к нестационарным методам из статики.

Создайте объект класса и вызовите метод

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

поэтому в вашем случае

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

Или создайте вызываемые методы как статические (которые вы уже пробовали, как вы сказали).