c# - 为什么这不会导致事件的无限循环?

标签 c# .net winforms events textchanged

我有一个简单的应用程序,可以反转在另一个文本框中输入的任何文本。要注意的是,您可以修改任一文本框,所做的更改将(字面上)反射(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/

相关文章:

c# - 在 C# 中选择随机数

c# - 添加两个 .NET SqlDecimals 会提高精度吗?

.net - 如何为公司使用 ASP.NET 成员(member)资格和 Active Directory

c# - 在不安全代码中设置图像像素时如何避免 "noise"

c# - 在 C# 中使用 BeginRead 捕获异常

C#:在 .NET 库中,是否有可以查看和打印 RTF 字符串的标准类?

c# - 使用泛型方法将继承的泛型类添加到字典

c# - 使用未知参数的 Lambda 函数

c#泛型基类方法返回派生类的类型

c# - 如何按列格式化数据表行数据