web-dev-qa-db-fra.com

Une référence d'objet est requise pour accéder au membre non statique

J'ai une minuterie et je veux mettre des rappels de minuterie dans des fonctions distinctes, mais j'obtiens cette erreur.

Une référence d'objet est requise pour accéder au champ, à la méthode ou à la propriété non statique '' ...

Si je déclare ces rappels comme des événements délégués et des variables membres comme statiques, cela fonctionne très bien. Dois-je le laisser comme ça?

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

}
13
user360330

Cela dépend de ce que vous essayez de faire. Vous pouvez soit rendre les choses statiques, o vous pouvez créer une instance:

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

Je suppose que ce n'est pas votre application réelle, il est donc difficile de dire ce que vous devez faire dans votre vrai code. Personnellement, je pencherais pour la création d'une instance - les variables statiques représentent un état global qui est généralement une mauvaise idée (en termes de testabilité, etc.). Nous ne pouvons pas dire si cela affecte votre situation ou non.

Ce qui est important, c'est que vous compreniez pourquoi vous obtenez le message d'erreur et pourquoi le changement ci-dessus le corrige. Une fois que vous aurez compris cela, vous serez dans une meilleure situation pour prendre les meilleures décisions.

23
Jon Skeet

C'est parce que vous accédez à des méthodes non statiques à partir de la statique dans ce cas.

Soit créer un objet de la classe et appeler la méthode

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

donc dans votre cas

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

Ou créez les méthodes appelées comme statiques (que vous avez déjà essayées comme vous l'avez dit).

1
Pranay Rana