while(true)
{
     User user=userManage.GetUserById(1);
     ……    //对User对象进行操作
    Thread.Sleep(10);
}与User user=null;
while(true)
{
    user=userManage.GetUserById(1);
    ……    //对User对象进行操作
    Thread.Sleep(10);
}
哪个更好,还是都是一样的,请高手指教!

解决方案 »

  1.   

    虽然.net有自动回收功能,不过还是建议后一个
      

  2.   

    如果较真的话,后一个是有楼主说的性能问题的
    前一个在循环执行完毕,所有对象都可自动回收
    而后一个,循环执行完后,仍突然保持着一个User对象的引用当然,一般情况下一个普通对象占用的内存基本是可以忽略不计的~ 
      

  3.   

    后一个中那个User对象,只有在当前作用域(比如所在的方法)结束,才符合垃圾回收条件
      

  4.   

    不论哪个,你都new了很多次。
      

  5.   

    实际看了下生成的ILDebug版后一种在最开始多了一行 ldnull,一行 stloc
    Release版完全一样结论:没有差别
      

  6.   

    如果你习惯用后一种写法, 我就呆以猜你是C/C++出身的,至少不是一开始学编程就用C#的
      

  7.   

    建议你先看下.NET GC原理。回不回收最基本的是看有没有GC root,其次看是否实现Finalize方法。具体就不详细说了。你可以用WinDbg attach到进程上用dps esp来查看当前栈内存中的内容。栈上引用的managed heap中的对象都是GC root,不会被回收。
      

  8.   

    如果是执行完方法体才回收的话,我就要用 viena 兄台建议的方法,把循环体中的代码提取到另一个方法中
      

  9.   

    回收时机是不确定的,跟是否是大对象,是强引用还是弱引用,是否类实现了Finalize方法,具体怎么实现(有的Finalize方法代码写的不好会造成对象复生),gc root等等都有关系。
      

  10.   

    如果你的循环中没有Sleep(),我可以负责任地告诉你,回收是在循环结束后进行的
      

  11.   

    如果你是说C++那种做法,那么C#里没有那回事
    只要GC没有去回收,那么对象就还在内存里,只是没人(可能出了GC)能访问到
      

  12.   


    对象在跳出方法体的时候不会释放,顶多只是被声明没有被引用,即当垃圾回收时确认可以回收资源
    不会回收,回收和Sleep无任何关系大致是
    1. 程序运行之初会分配一大段连续内存,除手动GC.Collect的情况,当程序运行至内存不够时,会进行垃圾回收
    2. 跳出方法体只是在CLR中对象的被引用计数减一,到0为止,表示没有被引用,即在垃圾回收执行时该内存可以被回收;垃圾回收比较复杂,还是建议去看看资料  我看的是 CLR via C#
      

  13.   

    没有任何差别,但是本着让变量的作用域尽可能小的原则,应使用第一个,当然,这只是出于培养编码风格上的考虑。至于提到的垃圾回收,在这里完全是个伪命题,垃圾回收是针对对象来说的,而不是针对变量的。当一个引用类型的对象没有根的时候,他就成了一个可以回收的对象。假设你没有把 user 对象存到什么列表里,也没有让他侦听什么事件。第一种写法,每次循环体执行完毕的时候, user 变量超出范围,他所引用的对象不再有根,于是,这个对象成为可回收的对象。第二种写法仅仅有一点点差别,当执行user=userManage.GetUserById(1);后,user变量指向了新的对象,他所指向的旧对象不再有根,于是旧对象变成可以回收的对象。这两种写法是一回事。
      

  14.   

    我觉得区别不大。userManage.GetUserById(1);返回的类型就是引用类型(类),每次循环时会重新复写user对象。
      

  15.   

    当然 有区别,习惯 后一种。
     两种 都new一个对象,但是
    前一种,每次 都 在 栈中声明了一个 变量,指向new出来的对象。
    后一种,是在循环前面就声明好了变量,不会重复创建,只是指向不同的引用对象。
    至于 释放问题,两种 都没有真正释放,只是 作用域问题,能不能访问。