使用System.Windows.Forms.Timer.Start()/Stop()与Enabled = true/false的区别

34

假设我们在一个.Net应用程序中使用System.Windows.Forms.Timer,在定时器上使用Start()和Stop()方法与使用Enabled属性有什么实际区别吗?

例如,如果我们希望在进行一些处理时暂停定时器,我们可以这样做:

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

或者,我们可以这样做:

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

如果没有显著的差异,社区中是否有关于选择哪个选项的共识?

6个回答

35

正如BFreeJames所说,从功能上讲,Start\StopEnabled没有区别。但是,使用哪种取决于语境和您自己的编码风格指南。这取决于您希望代码读者如何解释您所写的内容。

例如,如果您想让他们看到您正在启动一个操作并停止该操作,则可能要使用Start/Stop。然而,如果您想给人留下您正在启用某个功能的印象,那么使用Enabledtrue/false更为自然。

我认为不需要就仅使用其中一种达成共识,您真的必须根据代码的需求和维护来做出决定。


1
好的,基本上当计时器(Timer)的初始值为“false”,并且在运行时调用Start()方法后,计时器的Enabled属性值会变成“true”,对吗?抱歉,我应该写一个简单的代码示例。 - Jayson Ragasa

15

6
不,它们彼此等价。
请参见Timer.EnabledTimer.Start / Timer.Stop
关于共识的问题,我认为使用Start/Stop方法可能是更好的实践,这也更易读。
詹姆斯。

5
个人而言,我不喜欢将属性设置得过于重要,除了改变一个值之外,因此我倾向于坚持使用Start()/Stop(),因为当你调用一个方法时,你正在请求发生某些事情,这对我来说更加清晰明确。
话虽如此,我不认为设置Enabled = true会有太多的歧义 :)

我对此并不确定... 直到我阅读了文档,我的心理模型是Start()/Stop()会导致计时器开始或停止计数,而设置Enabled将控制计时器是否在时间到达时触发事件(这在您需要暂时阻止事件但稍后重新启用它们时保持相同的计划时非常有用)。 - Jules
@Jules 这很容易理解,但是不正确 :) 如果你设置 Enabled = true,下一个事件将在 Interval 后触发,而不是如果你没有禁用它们,下一个事件本来会触发的时间。 - Jon Grant
是的,我的观点是这是一个合理的解释,所以你应该避免使用Enabled属性来避免歧义,而不是建议它实际上是真的。 :) - Jules

2

以下是一个简单的代码,测试如何使用 EnabledStart()Stop() 进行工作。

创建一个测试 Windows 窗体应用程序,添加两个简单的按钮,然后将以下代码粘贴到 Form1() 构造函数中:

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

1
我不使用 timer.Stop()timer.Start(),因为它们是 timer.Enabled 的子程序。如果你想在应用程序开始时(加载时)将计时器设置为 false,你必须使用 timer.Enabled = falsetimer.Stop() 不起作用。这就是为什么我使用 timer.Enabled = false/true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接