我有一个表单(form1),上面有一个按钮(Button1)。
为什么示例1将Button1上的文本属性更改为form1上的“CHANGED”,但示例2不是?为什么会有区别?
示例1:
namespace WindowsFormsApplication35
{
public partial class Form1 : Form
{
Button b1 = new Button();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
b1 = button1;
b1.Text = "CHANGED";
}
}
}
示例2:
namespace WindowsFormsApplication35
{
public partial class Form1 : Form
{
Button b1 = new Button();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
button1 = b1;
b1.Text = "CHANGED";
}
}
}
答案 0 :(得分:1)
因为button1是在设计器中定义的,所以它在表单的自动生成代码中呈现,而另一个按钮只是实例化但没有与任何表单相关联。
答案 1 :(得分:0)
屏幕上的按钮有两个部分,"对象"在堆上的内存中以及对堆上的内存的引用,这是变量button1
所拥有的内容。
在InitializeComponent();
内,函数this.Controls.Add(button1)
将被调用。这将做的是它将添加另一个对象"对象"在this.Controls
的记忆中。
当您执行b1 = button1;
时,您将引用存储在使用b1
创建的对象的变量button1
中,然后当您执行b1.Text = "CHANGED";
时,您在哪里调用{关于变量.Text
,b1
和button1
内的引用都指向的对象的{1}}。
当您执行this.Controls
时,您将引用存储在使用button1 = b1;
创建的对象的变量button1
点中。现在,此时您有b1
和b1
指向使用button1
创建的对象,而b1
中存储的引用仍指向使用{{创建的对象1}}并且现在是指向该对象的唯一引用。当你this.Controls
在变量button1
和b1.Text = "CHANGED";
所指向的对象上调用.Text
但你没有更新指向的对象b1
时。
最后一个难题是参考文件存储在button1
中的对象是在屏幕上呈现的内容。这就是屏幕没有更新的原因。
答案 2 :(得分:0)
在示例1中,在创建Button
并指定b1
指向它后,您重新指定b1
指向与Button
相同的实际button1
。由于button1
按钮位于表单上,因此您可以看到它发生了变化。
在示例2中,您反过来了:您正在创建Button
b1
指向的button1
,然后您指向InitializeComponent
在那个模糊的按钮上。该按钮从未添加到表单的控件集合中,因此您无法在表单上看到它。
查看button1
方法中的代码(使用转到定义),了解您b1
没有的server.get('/wait', function(request, response){
var wait = true;
while (wait) { // force synchronous delay of 10s
setTimeout(function() {
console.log('answering now');
response.send('<pre>hello, i am 10s late</pre>');
wait = false;
}, 10000);
}
});
server.get('/now', function(request, response){
response.send('<pre>hello!</pre>');
});
会发生什么。
答案 3 :(得分:0)
执行此操作时:
Button b1 = new Button();
您只是创建Button
的实例并将其存储在内存中。在将表单添加到表单控件之前,b1
将不会显示在屏幕上:
Controls.Add(b1);
在示例1中,您执行了此操作:
b1 = button1;
这意味着您将b1
的值更改为button1
中存储的值。我假设这里button1
是由Windows窗体设计器生成的,因此它会以InitializeComponents
方法添加到屏幕上。
在运行上述行之前,b1
存储一个(参考a)按钮,该按钮不会出现在屏幕上。在该行运行后,b1
存储一个(参考a)按钮,该按钮确实出现在屏幕上。这就是您在设置b1
。
在示例2中,您执行了此操作:
button1 = b1;
您将button1
的值更改为b1
。
然后运行此行:
b1.Text = "CHANGED";
由于b1
仍会存储未在屏幕上显示的(引用a)按钮,因此您无法看到b1
更改的文字。