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

7

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

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

并不是开玩笑。我最初的想法是将其删除,但后来我和另一个开发人员交谈时,他提到可能有一些秘密活动正在进行,比如有人订阅了标签文本的更改等。老实说,我并不太担心这个问题,所以我打算保留它。然而,这就带来了我的问题:
假设有人订阅了TextChanged事件,例如。如果文本实际上没有更改,编译器会优化整个语句吗?事件是否真的会触发?

啊,是的,对不起。已编辑。 - DrewJordan
8
你自己检查一下不就行了吗?新建Winform -> 添加文本框 -> 在文本改变事件中设置断点 -> 在其他地方调用 textbox1.Text = textbox1.Text; - Rufus L
@RufusL 我希望能得到一些关于编译器处理它的信息...虽然我可以自己检查,但那不能告诉我为什么编译器会做出这样的决定,是否存在某些条件下它会触发,而在其他情况下则不会等等...我希望能找到一个更有经验的人来学习,而不仅仅是看它是否在这个特定情况下触发。 - DrewJordan
1
在 http://referencesource.microsoft.com/ 上查找该变量的类,并查看其实现。 - Steve Mitcham
编译器在这里不会做任何事情,因为属性设置不像设置字段。无论是否有副作用,您都必须跟踪代码,以查看除您发布的内容之外的部分。 - Steve Mitcham
显示剩余4条评论
3个回答

3

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


0
编译器不会优化掉它,除非可以证明它没有副作用。它是否具有副作用取决于Text属性设置方法的确切操作。该设置程序的操作由该方法的编写者决定。良好的行为是检查文本是否实际更改,并仅在发生实际更改时触发TextChanged事件。但是您不能只信任原始开发人员-现在是时候进行自己的测试了。挂钩TextChanged事件,看看当您设置文本但实际上未更改文本时它是否会触发。

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