请高手针对以下问题作一回答,我现在概念比较模糊:1.  只写int a; 跟写int a=1;   在内存上有什么区别?(就堆和栈分别讨论)2.  问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论)3.  如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?4.  对于Form a=new Form(); a.Close();和a.Dispose(),以及a=null;后在内存中有什么区别呢?也是说堆和栈。希望详细回答,谢谢!

解决方案 »

  1.   

    int a;是只定义一个a
    int a=1是不仅定义一个a 而且为他赋值为1
    Form a=new Form()是实例化一个对象
    Form a=null是定义一个对象为空
    只写了 Form a 会占内存  但是C#有自动垃圾回收
    a.Close();是关闭
    a.Dispose()是释放所有的资源
      

  2.   

    1.  只写int a; 跟写int a=1;  在内存上有什么区别?(就堆和栈分别讨论) ->都在栈上分配了4个字节,前者没做其他的操作,后者把分配的空间初始化为12.  问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论) ->Form a;和Form a=null; 跟第一个问题是一样的,前者没有初始化,后者初始化了(未初始化意味着你不能用它(out 参数除外)),所以如果你后面马上写MessageBox.Show(a.ToString());的话,前者编译不过,后者成功。(运行时异常那是另一回事,跟语法无关)Form a=new Form();这是3个操作
    Form a;//说过了
    new Form();//在堆上分配一个Form对象并返回其内存地址
    Form a=new Form();//将new产生的内存地址赋值给a,从而使a指向改内存3.  如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占? 
    是不是用,跟占不占内存无关,只要在作用域和生命期,就会占内存。不过前面告诉你了,只有new操作才真正分配内存,单独一个Form a;只是在栈上分配了一个4字节的指针4.  对于Form a=new Form(); a.Close();和a.Dispose(),以及a=null;后在内存中有什么区别呢?也是说堆和栈。 
    Close和Dispose的区别自己在.net的源码,不过我可以告诉你,Close方法在绝大多数情况是直接调用Dispose方法,也就是说没有任何区别。
    a=null;让a不指向任何内存Close和Dispose方法释放内存了,a=null没有做有用的操作,但垃圾收集器会在适当的时候回收a原来指向的内存(因为a不再执行它,那块内存就可以被GC回收了)
      

  3.   

    先回答第一个问题
    1.  只写int a; 跟写int a=1;  在内存上有什么区别?(就堆和栈分别讨论) 
    int a;这个只是个定义,因为a是值类型,所以先入栈。没有堆的操作
    int a=1;
    这一句其实可以这么写
    //实例
    int a = new Int();
    //C#的简写
    int a=1;
    两者的效果是一样的 从上面的代码我们可以知道a是一个实例 而且还是个值类型
    所以会在栈中分配空间,并设值为1。因为是值类型所以没有堆的操作。
      

  4.   

    回答第二个问题
    2.  问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论) 
    首先我们要搞清楚From是什么,他是个引用类型。
    声明定义同存储无关,不要去套在一起 
    和存储有关的只是形成对象的时候,也就是new的时候
    Form a = new Form()
    记住一句话黄金规则引用类型总是放在堆中。
    这个时候会在a将被放置在堆上,同时在栈上生成一个指向这个堆的指针引用。
    也就是堆和栈都有影响
    Form a=null;
    这句话会将指向这个堆的指针引用给删除了,那也就是栈中声明没了,但是a这个实例还在堆中
    在这种情况下,它会成为垃圾回收器的回收对象。
      

  5.   

    回答问题3
    3.  如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?
    这里的确我也迷惑过,要记住!
    声明定义同存储无关,不要去套在一起 
    和存储有关的只是形成对象的时候,也就是new的时候 !!
      

  6.   

    回答第4个问题
    CsToD兄已经说的很明白了~  手脚真快!刚回贴已经是3楼了~..
    ok了 不懂的可以再问~~
      

  7.   

    谢谢楼上各位,尤其CsToD和乔巴的回答,茅塞顿开的感觉。。
      

  8.   

    楼上讲的很清楚了。补充一下第3条
    .  如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占? Form a; 
    因为它是一个在栈中创建的引用,所以,它的生命周期 应该跟包含这条语句的一对花括号有关,
    出了花括号,就玩完了。。