我有一个计时器,我想将计时器回调放入单独的函数,但是,我得到这个错误.
访问非静态字段,方法或属性''需要对象引用...
如果我将这些回调声明为委托事件和成员变量为静态,它可以正常工作.我应该这样离开吗?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 23
这取决于你想要做什么.你可以要么让事情静态的,或者你可以创建一个实例:
MainClass instance = new MainClass();
btn.Clicked += instance.StartClick;
btn_stop.Clicked += instance.StopClick;
Run Code Online (Sandbox Code Playgroud)
我认为这不是你真正的应用程序,因此很难说你应该在真正的代码中做什么.我个人倾向于创建一个实例 - 静态变量代表全局状态,这通常是一个坏主意(在可测性等方面).但我们无法判断这是否会影响您的情况.
重要的是,您了解为什么您收到错误消息以及上述更改为什么会修复它.一旦你理解了这一点,你将处于更好的状态,以做出最好的决定.