我有一个计时器,我想将计时器回调放入单独的函数中,但是,出现此错误。需要对象引用才能访问非静态字段,方法或属性''...如果我将这些回调声明为委托事件,并将成员变量声明为静态,则可以正常工作。我应该这样吗?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(); }}
2 回答
斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
这取决于您要执行的操作。你可以要么让事情静态的,或者你可以创建一个实例:
MainClass instance = new MainClass();
btn.Clicked += instance.StartClick;
btn_stop.Clicked += instance.StopClick;
我认为这不是您的真实应用程序,因此很难说出您应该在真实代码中执行的操作。我个人倾向于创建实例-静态变量表示全局状态,通常这是一个坏主意(就可测试性而言)。我们无法确定这是否会影响您的情况。
重要的是要了解为什么会收到错误消息以及上述更改为何可以解决该错误消息。了解了这一点之后,您将可以更好地制定最佳决策。
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
这是因为在这种情况下,您要从静态方法访问非静态方法。
创建类的对象,然后调用方法
ObjectOfClass obj = new ObjectOfClass();
obj.MethodName();
所以你的情况
MainClass obj = new MainClass();
btn.Clicked += obj.StartClick;
btn_stop.Clicked += obj.StopClick;
或将调用的方法创建为静态方法(已按您的说明尝试过)。
- 2 回答
- 0 关注
- 476 浏览
添加回答
举报
0/150
提交
取消