namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int i=1; string str = "我"; void print() { i = 3; str = "我爱提问"; label1.Text = Convert.ToString(i)+str; } private void Form1_Load(object sender, EventArgs e) { print(); label2 .Text = Convert .ToString (i)+str; } } }
运行结果label1=3我爱提问:label2=3我爱提问;
是不是窗体一加载,在栈中给i分配空间 i=1,调用方法print(),用栈中的i的同一块内存,数据i=3,方法结束后,栈中i存的是3
窗体一加载,在堆中给str分配空间 str="我",返回引用给str,调用方法print(),在堆中另分配一块空间str="我爱提问",把引用返回给str,方法结束后str的引用指向str="我爱提问"。
你说的没错。
很奇怪,你为什么对堆栈之类的这么感兴趣?我已经推荐你去阅读《CLR VIA C#》了,你却在这里问这个问题。
堆、栈技术是很底层的,一般的程序员是很少有机会去接触这些东西,除非你研究的就是系统级的东东。
至于你的这个问题,在.NET中,当构建一个类的时候:
1、会把类成员分配好空间(定义好成员变量)
2、如果类成员变量在定义的时候有赋值,则执行赋值操作
3、调用相应的构造函数
所有的这些行为都是先基类后派生类的。
至于你的这个问题,那是窗体加载相关的,当一个窗体加载后,会有一系列的事务处理(具体有哪些,那就老多了,我也一知半解),其中一个就是触发窗机加载事件(Load),假如你绑定了Load事件,则会执行,从你的代码看是绑定了,所以会执行方法Form_Load,而方法里。。。你自己要去分析咯。
窗体的最终显示是一定要等到Load事件执行完成以后的。
好笼统啊。
@易顺金: 不笼统。你理解透了就不笼统了。
其实,你对OOP思想,C#基础编程都还没正式入门,却来研究什么堆啊栈啊,那是没意义的。
如果你一定要研究堆栈,就不要拿这些东西来说事,应该去讨论专门的OS原理、计算机原理之类的。
错,都在堆上的.