C#:使用引用

时间:2016-09-10 16:36:39

标签: c# reference

我有一个表单(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";
        }
    }
}

4 个答案:

答案 0 :(得分:1)

因为button1是在设计器中定义的,所以它在表单的自动生成代码中呈现,而另一个按钮只是实例化但没有与任何表单相关联。

答案 1 :(得分:0)

屏幕上的按钮有两个部分,"对象"在堆上的内存中以及对堆上的内存的引用,这是变量button1所拥有的内容。

InitializeComponent();内,函数this.Controls.Add(button1)将被调用。这将做的是它将添加另一个对象"对象"在this.Controls的记忆中。

当您执行b1 = button1;时,您将引用存储在使用b1创建的对象的变量button1中,然后当您执行b1.Text = "CHANGED";时,您在哪里调用{关于变量.Textb1button1内的引用都指向的对象的{1}}。

当您执行this.Controls时,您将引用存储在使用button1 = b1;创建的对象的变量button1点中。现在,此时您有b1b1指向使用button1创建的对象,而b1中存储的引用仍指向使用{{创建的对象1}}并且现在是指向该对象的唯一引用。当你this.Controls在变量button1b1.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更改的文字。