我有一个计时器,我想放置计时器回调 但是,我得到了这个错误。
访问非静态字段,方法或属性''...
需要对象引用
如果我将这些回调声明为委托事件和 成员变量为静态,它工作正常。我应该这样离开吗?
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();
}
}
答案 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;
或者将被调用的方法创建为静态(您已按照自己的意思尝试过)。