访问非静态成员需要对象引用
我有一个计时器,我想放置计时器回调 到单独的函数中,但是,我收到此错误。
访问非静态字段、方法或属性需要对象引用''...
如果我将这些回调声明为委托事件并且 成员变量作为静态的,它工作得很好。我应该就这样留下吗?
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();
}
}
I have a timer and I want to put timer callbacks
into separate functions, however, I get this error.
An object reference is required to access non-static field, method, or property ''...
If I declare these callbacks as delegate events and
member variables as static, it works fine. Should I leave it that way?
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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
这取决于你想做什么。您可以或者使事物静态,或者您可以创建一个实例:
我假设这不是您的真实应用程序,所以很难说你应该在实际代码中做什么。就我个人而言,我倾向于创建一个实例 - 静态变量代表全局状态,这通常是一个坏主意(就可测试性等而言)。但我们无法判断这是否会影响您的情况。
重要的是您了解为什么收到错误消息以及为什么上述更改可以解决该问题。一旦你明白了这一点,你就能更好地做出最好的决定。
It depends what you're trying to do. You can either make things static, or you can create an instance:
I assume this isn't your real application, so it's hard to say what you should do in your real code. Personally I'd lean towards creating an instance - static variables represent global state which is usually a bad idea (in terms of testability etc). We can't tell whether that affects your situation or not though.
What's important is that you understand why you're getting the error message and why the above change fixes it. Once you understand that, you'll be in a better situation to make the best decisions.