2011-08-09 19 views
11

Tengo un temporizador y quiero poner callbacks de temporizador en funciones separadas, sin embargo, aparece este error.Se necesita una referencia de objeto para acceder al miembro no estático

Se requiere una referencia de objeto para acceder campo no estático, método o propiedad '' ...

Si declaro estas devoluciones de llamada como eventos de delegados y variables miembro como estática, funciona multa. ¿Debo dejarlo así?

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

¿por qué no utilizar Application.Run (new MainWindow()); luego suscribe los eventos dentro de la clase? – aspark

Respuesta

22

Depende de lo que estés tratando de hacer. Puede ya sea hacer las cosas estática, o puede crear una instancia:

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

Asumo que esto no es su aplicación real, por lo que es difícil decir lo que debe hacer en su código real . Personalmente, me inclino por crear una instancia: las variables estáticas representan un estado global que es , generalmente, una mala idea (en términos de capacidad de prueba, etc.). Sin embargo, no podemos decir si eso afecta su situación o no.

Lo importante es que entiendas por qué recibes el mensaje de error y por qué el cambio anterior lo soluciona. Una vez que comprenda eso, estará en una mejor situación para tomar las mejores decisiones.

+0

Sí, está claro ahora. Y probablemente debería poner mi clase de temporizador en un archivo separado. ¡Gracias! –

+0

Es extraño que esto funcionó en mi caso, pero básicamente era justo lo que necesitaba. Gracias ~ – James

1

Es porque está accediendo a métodos no estáticos desde la estática en este caso.

Cualquiera de crear el objeto de la clase y de llamar al método

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

por lo que en su caso

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

o crear los llamados métodos como estáticos (que ya ha probado como usted ha dicho).

Cuestiones relacionadas