WPF事件奇怪的行为

时间:2017-12-14 16:02:20

标签: c# wpf events

我遇到了WPF事件的问题,我让我解决了。但我不确定为什么我的解决方案有效以及为什么问题首先存在。

以下代码按预期运行:

void Test () {

    TextBox tbOne = new TextBox();
    TextBox tbTwo = new TextBox();

    tbOne.TextChanged += (sender, e) => Change(sender, e, 1);
    tbTwo.TextChanged += (sender, e) => Change(sender, e, 2);

    tbOne.Text = "asdf";
    tbTwo.Text = "asdf";
}

public void Change (object sender, TextChangedEventArgs e, int i)
{
    MessageBox.Show("Changed " + i);
}

显示两个消息框:
"更改了1"和"更改了2"



我希望以下代码的结果是相同的:

void Test () {

    TextBox tbOne = new TextBox();
    TextBox tbTwo = new TextBox();

    int i = 1;
    tbOne.TextChanged += (sender, e) => Change(sender, e, i);
    i = 2;
    tbTwo.TextChanged += (sender, e) => Change(sender, e, i);

    tbOne.Text = "asdf";
    tbTwo.Text = "asdf";
}

public void Change (object sender, TextChangedEventArgs e, int i)
{
    MessageBox.Show("Changed " + i);
}

但显示"更改2"和"更改了2"


在我的情况下(这个代码被大量简化)我必须将整数放入它自己的类中,以便记住"它正确。

void Test () {

    TextBox tbOne = new TextBox();
    TextBox tbTwo = new TextBox();

    int i = 1;
    IntClass icOne = new IntClass(i);
    tbOne.TextChanged += (sender, e) => Change(sender, e, icOne);
    i = 2;
    IntClass icTwo = new IntClass(i);
    tbTwo.TextChanged += (sender, e) => Change(sender, e, icTwo);

    tbOne.Text = "asdf";
    tbTwo.Text = "asdf";
}

public void Change (object sender, TextChangedEventArgs e, IntClass i)
{
    MessageBox.Show("Changed " + i.i);
}

IntClass类定义如下:

public class IntClass {
    public int i;
    public IntClass (int j)
    {
        i = j;
    }
}

这正确地给予"改变了1"和"更改了2"。


我的问题是,为什么它适用于作为引用存储的类和对象的实例(或直接键入的整数)而不是int变量?
我知道int不是使用引用而是通过值本身存储的,但我不明白为什么它应该有所不同。

提前谢谢!

0 个答案:

没有答案