我有一个简单的应用程序,可以反转在另一个文本框中输入的任何文本。要注意的是,您可以修改任一文本框,所做的更改将(字面上)反射(reflect)在另一个文本框中。
我写了这段代码,相信它会导致问题。
private void realText_TextChanged(object sender, EventArgs e)
{
mirrorText.Text = mirror(realText.Text);
}
private void mirrorText_TextChanged(object sender, EventArgs e)
{
realText.Text = mirror(mirrorText.Text);
}
private string mirror(string text)
{
return new string(text.Reverse().ToArray()).Replace("\n\r", "\r\n");
}
然后我尝试了一下,认为它会导致无限循环(realText
更改 mirrorText
,另一个事件发生,mirrorText
更改 realText
等)。但是,除了预期的行为外,什么也没有发生。
我当然很高兴,我可以把它留在这里。 或者我可以吗?
我很确定 TextChanged
事件应该在 Text
更改时触发。这是事件中某些错误保护的预期行为,还是我只是幸运?此代码在另一台计算机上是否会因其他build设置等而出现异常?它可以很容易地修复:
private void realText_TextChanged(object sender, EventArgs e)
{
if (realText.Focused)
{
mirrorText.Text = Mirror(realText.Text);
}
}
为了安全起见,我可能还是会这样做,但是需要检查这个吗? (我什至不会问是否推荐它。)
最佳答案
根据评论和已经回答的,当您将 Text
属性设置为它已有的值时,不会引发 TextChanged
事件。
尚不清楚这是否是您可以放心依赖的东西。这是一个明智的优化,如果 .NET Framework 的 future 版本放弃它,我会感到非常惊讶,但我不能代表旧版本,也不能代表第三方实现 (Mono)。
为了绝对安全,我不会使用Focused
检查您提出的问题。我会完全 Text
setter 现在做的事。
private void realText_TextChanged(object sender, EventArgs e)
{
var newMirrorText = Mirror(realText.Text);
if (mirrorText.Text != newMirrorText)
mirrorText.Text = newMirrorText;
}
这具有防止无限递归的相同优点,但与您可能放入表单中的其他代码一起使用时效果更好,这些代码会因其他事件而更改文本。
关于c# - 为什么这不会导致事件的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27014639/