如果文本没有更改,是否会触发TextChanged事件?

时间:2015-04-17 18:39:55

标签: c# winforms compiler-optimization

我正在为从其他来源购买的客户定制(和修复)大型应用程序。我们最终得到的代码肯定不是源客户端生产中使用的实际代码。话虽如此,我今天遇到了这个:

if (lblCurrentValueOfContractAmount.Text == "0.0")
   lblCurrentValueOfContractAmount.Text = "0.0";

不,我不是在开玩笑。我的第一个倾向是删除它,然后我开始与另一位开发人员交谈,他们提到可能会有一些秘密的东西在这里发生,就像有人订阅了标签的文字被更改等等。老实说,我'我并不关心它,所以我只是要把它留下来。但是,这让我想到了我的问题:

假设 某人订阅了TextChanged,例如。如果文本实际上没有改变,那么编译器会优化整个语句吗?活动会真的开火吗?

3 个答案:

答案 0 :(得分:3)

假设您有一个Winforms标签(或其他Control派生类),代码将不会触发更改事件,因此该代码没有副作用,可以删除。 http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,9884211b7ff61817

        public virtual string Text {
        get { ... }

        set {
            if (value == null) {
                value = "";
            }

            if (value == Text) {
                return;
            }
            // omitted remainder
        }
    }

答案 1 :(得分:0)

除非可以证明没有副作用,否则编译器不会对其进行优化。它是否具有副作用是Text属性setter方法的确切问题。这个setter的作用取决于该方法的作者。好的行为是检查文本是否实际发生了变化,只有在发生真正的变化时才触发TextChanged事件。但是你不能只信任原始的开发人员 - 时间对你自己进行一些测试。挂钩TextChanged事件,看看它是否会在您设置但不实际更改文本时触发。

答案 2 :(得分:0)

事件不会反复发作。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    // This does not cause the event to continuously fire
    textBox1.Text = textBox1.Text;
}

我最初将文本框设置为值“0.0”,然后执行此操作:

private void Form1_Load(object sender, EventArgs e)
{
    textBox1.Text = "0.0";
}

这不会导致TextChangedEvent触发。