我遇到了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不是使用引用而是通过值本身存储的,但我不明白为什么它应该有所不同。
提前谢谢!