2009-06-18 5 views
28

Angenommen, wir verwenden System.Windows.Forms.Timer in einer .Net-Anwendung, Gibt es einen sinnvollen Unterschied zwischen der Verwendung die Methoden Start() und Stop() für den Zeitgeber im Gegensatz zur Verwendung der Eigenschaft Enabled?Verwenden von System.Windows.Forms.Timer.Start()/Stop() versus Enabled = true/false

Zum Beispiel, wenn wir einen Timer zu unterbrechen wollen, während wir einige Berechnungen durchführen, könnten wir tun:

myTimer.Stop(); 
// Do something interesting here. 
myTimer.Start(); 

oder, was wir tun konnten:

myTimer.Enabled = false; 
// Do something interesting here. 
myTimer.Enabled = true; 

Wenn es keinen signifikanten ist Unterschied, gibt es einen Konsens in der Gemeinde über welche Option zu wählen?

Antwort

30

Da beide von BFree angegeben und James, gibt es keinen Unterschied in Start\Stop gegen Enabled in Bezug auf Funktionalität. Die zu verwendende Entscheidung sollte jedoch auf dem Kontext und den eigenen Richtlinien für den Codierungsstil basieren. Es hängt davon ab, wie Sie möchten, dass ein Leser Ihres Codes das, was Sie geschrieben haben, interpretiert.

Wenn Sie beispielsweise sehen möchten, was Sie tun, wenn Sie eine Operation starten und diese Operation stoppen, möchten Sie wahrscheinlich Start/Stop verwenden. Wenn Sie jedoch den Eindruck erwecken möchten, dass Sie die Zugänglichkeit oder Funktionalität eines Features aktivieren, ist die Verwendung von Enabled und true/false natürlicher.

Ich glaube nicht, dass ein Konsens notwendig ist, wenn Sie nur das eine oder das andere verwenden, Sie müssen sich wirklich entscheiden, basierend auf den Anforderungen Ihres Codes und dessen Wartung.

+1

ok so im Allgemeinen, wenn der Anfangswert der Timer.Enabled „false“ ist, und in der Laufzeit Ich habe Start() aufgerufen, der Timer.Enabled Wert würde nun "True" oder? Entschuldigung, ich sollte stattdessen einen einfachen Code schreiben. –

+0

das ist richtig. –

6

Nein, sie sind einander äquivalent.

Siehe Timer.Enabled und Timer.Start/Timer.Stop

auf Ihre Frage zum Konsens hinzuzufügen, würde ich seine sagt wahrscheinlich besser Praxis, die Start/Stopp-Methoden zu verwenden, und es ist auch besser für die Lesbarkeit nehme ich an.

James.

5

Ich persönlich mag es nicht, Eigenschaften festlegen zu viel Folge haben andere als einen Wert zu verändern, so dass ich neigen dazu, die Start()/Stop() zu halten, wie es mir klar (er) ist, wenn Sie eine Methode aufrufen, Sie verlangen, dass etwas passiert.

Das heißt, ich glaube nicht, daß es eine ganze Menge Unklarheit darüber, was Enabled = true Einstellung ist :)

+0

Da bin ich mir nicht sicher ... bis ich die Dokumentation gelesen habe, war mein mentales Modell, dass Start()/Stop() den Timer zum Starten oder Stoppen des Zählens veranlasste, während die Einstellung Aktiviert ob Ereignisse ausgelöst wurden Timer abgelaufen (dies wäre nützlich in Fällen, in denen Sie möglicherweise vorübergehend Ereignisse verhindern müssen, aber denselben Zeitplan für sie beibehalten, wenn Sie sie später erneut aktivieren). – Jules

+0

@Jules Das ist verständlich, aber falsch :) Wenn Sie 'Enabled = true 'setzen, wird das nächste Ereignis nach' Interval 'ausgelöst, nicht wenn das nächste Ereignis ausgelöst worden wäre, wenn Sie es nicht deaktiviert hätten. –

+0

Ja; Mein Punkt ist, dass dies eine plausible Interpretation ist, also sollten Sie die Mehrdeutigkeit vermeiden, indem Sie nicht die Enabled-Eigenschaft verwenden, anstatt zu vermuten, dass sie tatsächlich wahr ist. :) – Jules

1

ich nicht timer.Stop() und timer.Start() verwenden tun wird, weil sie U-Boote von timer.Enabled sind. Wenn Sie den Timer zu Beginn der Anwendung (beim Laden) auf false setzen wollen, müssen Sie timer.Enabled = false verwenden, timer.Stop() wird nicht funktionieren. Deshalb verwende ich timer.Enabled = false/true.

2

Hier ist ein einfacher Code zu testen, wie Enabled, Start(), Stop() miteinander arbeiten.

ein Test Windows-Formular app, fügen Sie zwei einfache Tasten und diesen Code in Form1() Konstruktor einfügen:

int c = 0; 
Timer tmr1 = new Timer() 
{ 
    Interval = 100, 
    Enabled= false 
}; 
tmr1.Tick += delegate 
{ 
    c++; 
}; 

// used to continously monitor the values of "c" and tmr1.Enabled 
Timer tmr2 = new Timer() 
{ 
    Interval = 100, 
    Enabled = true 
}; 
tmr2.Tick += delegate 
{ 
    this.Text = string.Format("c={0}, tmr1.Enabled={1}", c, tmr1.Enabled.ToString()); 
}; 

button1.Click += delegate 
{ 
    tmr1.Start(); 
}; 
button2.Click += delegate 
{ 
    tmr1.Stop(); 
};