Ссылка на объект требуется для доступа к нестационарному элементу
У меня есть таймер, и я хочу поставить обратные вызовы таймера
однако я получаю эту ошибку.
Ссылка на объект требуется для доступа к нестатическому полю, методу или свойству ''...
Если я объявляю эти обратные вызовы как делегированные события и
переменные-члены как статические, он работает нормально. Должен ли я оставить это таким образом?
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;
Или создайте вызываемые методы как статические (которые вы уже пробовали, как вы сказали).