如果文本没有改变,TextChanged事件会触发吗?

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

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

不,我不是在开玩笑。 我的第一个想法是刚刚删除它,然后我开始跟另一位开发人员交谈,他提到可能会有一些秘密的事情发生在这里,比如有人订阅了标签的文本被更改等等。老实说,我并不关心它,所以我只是想把它留下。但是,这使我想到了我的问题:

例如,假设有人订阅了TextChanged 。 如果文本没有真正改变,编译器是否会优化整个语句? 事件真的会发生吗?


假设你有一个Winforms标签(或其他控制派生类),代码将不会触发更改事件,因此该代码没有副作用并可以被删除。 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
        }
    }

编译器不会优化它,除非可以证明它没有副作用。 它是否有副作用与Text属性设置器方法的作用有关。 那个制定者所做的是取决于该方法的作者。 良好的行为是检查文本是否真的发生了变化,并且只在发生真正的变化时才触发TextChanged事件。 但是你不能只相信原始开发者 - 有时间去做一些你自己的测试。 TextChanged事件并查看它在设置时是否触发,但实际上并未更改文本。


该事件不会一遍又一遍地开火。

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触发。

链接地址: http://www.djcxy.com/p/25757.html

上一篇: Does a TextChanged event fire if the text hasn't changed?

下一篇: Scala