访问非静态成员需要一个对象引用

我有一个计时器,我想把计时器callback到不同的function,但是,我得到这个错误。

访问非静态字段,方法或属性“…”需要对象引用。

如果我将这些callback声明为委托事件和成员variables静态,它工作正常。 我应该这样离开吗?

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(); } } 

这取决于你想要做什么。 你可以把事情做成静态的,也可以创build一个实例:

 MainClass instance = new MainClass(); btn.Clicked += instance.StartClick; btn_stop.Clicked += instance.StopClick; 

我认为这不是你的真正的应用程序,所以很难说你真正的代码应该做什么。 我个人倾向于创build一个实例 – 静态variables代表全局状态,这通常是一个坏主意(在可testing性等方面)。 但是,我们无法分辨这是否会影响您的情况。

重要的是你明白你为什么会收到错误信息,以及为什么上述修改能够解决这个问题。 一旦你明白了,你将会处于一个更好的状况下做出最好的决定。

这是因为在这种情况下你正在从静态访问非静态方法。

创build类的对象并调用方法

 ObjectOfClass obj = new ObjectOfClass(); obj.MethodName(); 

所以在你的情况

 MainClass obj = new MainClass(); btn.Clicked += obj.StartClick; btn_stop.Clicked += obj.StopClick; 

或者将被调用的方法创build为静态(您已经按照您的说法尝试过了)。