如果文本未更改,是否会触发 TextChanged 事件?
Does a TextChanged event fire if the text hasn't changed?
我正在为从其他来源购买的客户定制(和修复)大型应用程序。我们最终获得的代码肯定不是源客户端在生产中使用的实际代码。话虽这么说,我 运行 今天进入这个:
if (lblCurrentValueOfContractAmount.Text == "0.0")
lblCurrentValueOfContractAmount.Text = "0.0";
不,我不是在开玩笑。我的第一个想法是直接删除它,然后我开始与另一位开发人员交谈,他提到这里可能发生了一些秘密的事情,比如有人订阅了标签的文本被更改等。老实说,我并不那么担心,所以我打算把它留在里面。但是,这让我想到了我的问题:
例如,假设 是 人订阅了 TextChanged
。如果文本实际上没有改变,编译器会优化整个语句吗?该事件真的会触发吗?
除非可以证明它没有副作用,否则编译器不会优化它。它是否有副作用取决于 Text
属性 setter 方法的作用。 setter 的作用取决于该方法的作者。好的行为是检查文本是否真的发生了变化,并且只有在真正发生变化时才触发 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 触发。
假设您有一个 Winforms 标签(或其他派生的控件 class),该代码不会触发更改事件,因此该代码没有副作用,可以删除。 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
}
}
我正在为从其他来源购买的客户定制(和修复)大型应用程序。我们最终获得的代码肯定不是源客户端在生产中使用的实际代码。话虽这么说,我 运行 今天进入这个:
if (lblCurrentValueOfContractAmount.Text == "0.0")
lblCurrentValueOfContractAmount.Text = "0.0";
不,我不是在开玩笑。我的第一个想法是直接删除它,然后我开始与另一位开发人员交谈,他提到这里可能发生了一些秘密的事情,比如有人订阅了标签的文本被更改等。老实说,我并不那么担心,所以我打算把它留在里面。但是,这让我想到了我的问题:
例如,假设 是 人订阅了 TextChanged
。如果文本实际上没有改变,编译器会优化整个语句吗?该事件真的会触发吗?
除非可以证明它没有副作用,否则编译器不会优化它。它是否有副作用取决于 Text
属性 setter 方法的作用。 setter 的作用取决于该方法的作者。好的行为是检查文本是否真的发生了变化,并且只有在真正发生变化时才触发 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 触发。
假设您有一个 Winforms 标签(或其他派生的控件 class),该代码不会触发更改事件,因此该代码没有副作用,可以删除。 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
}
}