我有一个计时器,我想将计时器回调放入单独的函数中,但是,出现此错误。
需要对象引用才能访问非静态字段,方法或属性’‘…
如果我将这些回调声明为委托事件,并将成员变量声明为静态,则可以正常工作。我应该这样吗?
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(); } }
这取决于您要执行的操作。你可以 要么 让事情静态的, 或者 你可以创建一个实例:
MainClass instance = new MainClass(); btn.Clicked += instance.StartClick; btn_stop.Clicked += instance.StopClick;
我认为这不是您的 真实 应用程序,因此很难说出您应该在真实代码中执行的操作。我个人倾向于创建实例-静态变量表示全局状态, 通常 这是一个坏主意(就可测试性而言)。我们无法确定这是否会影响您的情况。
重要的是要了解 为什么 会收到错误消息以及上述更改为何可以解决该错误消息。了解了这一点之后,您将可以更好地制定最佳决策。