生存周期和作用域 相关,请帮忙解惑!!

jin20000 2009-04-09 11:23:33
今天看MSDN上有关窗体继承时,看到了"使用 Modifiers 和 GenerateMember 属性",
对GenerateMember 有些不理解,照MSDN上的,拖了两个Button到Form上,把button2的GenerateMember 设成了False,button1的GenerateMember 为True,
并且分别在两个button的click事件下都messagebox了一个.
查看了一下源码,

/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.Button button2;
this.button1 = new System.Windows.Forms.Button();
button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button2
//
button2.Location = new System.Drawing.Point(187, 107);
button2.Name = "button2";
button2.Size = new System.Drawing.Size(75, 23);
button2.TabIndex = 1;
button2.Text = "say hi";
button2.UseVisualStyleBackColor = true;
button2.Click += new System.EventHandler(this.button2_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(187, 47);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "say hello";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "BaseForm";
this.ResumeLayout(false);

}

#endregion

protected System.Windows.Forms.Button button1;

事件代码:

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("hello !");
}

private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Hi");
}

区别就是button2是定义在InitializeComponent方法中的局部变量.
但我运行起来,点button2任然还是会弹出一个对话框"Hi",这让我很疑惑,button2是个局部变量,出了InitializeComponent方法,就应该已经过了生存周期和作用域了的啊,请帮忙解惑!!!!
...全文
93 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
春天的气息 2009-04-09
  • 打赏
  • 举报
回复
可以看控件的情况说呀,每个参数或功能都有明确的作用域、时效哦。
Zedee 2009-04-09
  • 打赏
  • 举报
回复
我认为和机制有关,否则如果只是在InitializeComponent内部才生效的话,这个控件可以说没什么意义了
cja03 2009-04-09
  • 打赏
  • 举报
回复
public void Test()
{
Timer timer = new Timer();
timer.Tick += delegate
{
MessageBox.Show("Hi");
}
timer.Enabled = true;
}
jin20000 2009-04-09
  • 打赏
  • 举报
回复
这个是不是和VS本身的界面设计运行机制有关啊?
高手请进来帮忙啊
jin20000 2009-04-09
  • 打赏
  • 举报
回复
请帮忙解惑,分不够的化,明天加.
yanm7788 2009-04-09
  • 打赏
  • 举报
回复
mark
jin20000 2009-04-09
  • 打赏
  • 举报
回复
自己先顶一下
jin20000 2009-04-09
  • 打赏
  • 举报
回复
好了,结贴..
whyabc 2009-04-09
  • 打赏
  • 举报
回复
有点道理!
jin20000 2009-04-09
  • 打赏
  • 举报
回复
想了一个中午,我个人觉得应该是这样的.
button2在InitializeComponent方法结束后确实应该是生存周期结束了的.
不过在InitializeComponent方法中有这么一句,this.controls.add(button2);
也就是说,button2引用的对象有两个引用,一个就是button2(InitializeComponent方法局部变量),一个就是this.controls[0]
,InitializeComponent方法结束后,button2的引用指为null了,而this.controls[0]却还在.
所以运行起来后,点击button这个按钮,弹出对话框"Hi",应该是this.controls[0],而不是buttons2这个局部变量,虽然它们之前指向的引用都是同一个.
这样理解行不行呢?

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧