o的作用域并没有结束,这是托管代码的自动拉圾处理功能带来的好处,这和C语言不同。自动拉圾处理会再适当的时候来处理掉o这个对象的。

解决方案 »

  1.   

    o这个名字的对象引用的作用域与生存期都是在这个函数中,但是通过new的对象实体的作用域在本函数中,但一旦被外部变量引用,其实体仍然有效,也就是它的生存期不确定,超出其作用域,有的C#书会专门讲这个的,当没有引用在引用它的实体,gc就会废弃它,这时再到它的生存期终点,但具体时间只有gc知道
      

  2.   

    谢谢Aaron_Lau(根本英俊)的回答,但还是有些不明白
    o的作用域没有结束?那么作用域是如何定义的?作用域和生存期是不是同时结束的?
      

  3.   

    gogogo(嘿嘿),有点清楚了
    那么在C++中对象是不是在它的作用域结束时调用析构函数的,如果是那这个方法该如何写
      

  4.   

    c++其实也是在生存期结束时调用析构函数,不过它是即时调用,和C#不同,所以C#不推荐多使用析构函数来释放资源,而用Dispose显示调用.
    C++
    class a
    {
      a(int i)
      {}
      ~a()
      {
      }
    }f()
    {
      a a1(1);
    }
    a f1()
    {
      a a2(2);
      return a2;
    }
    在f结束时就调用a的析构函数
    在f1结束时就不调用a的析构函数
      

  5.   

    非常感谢gogogo(嘿嘿) 的耐心讲解,还想讨教个问题:
    在f1中的a是不是必须等到我们手工析构才会销毁,传说中的内存泄露是不是就在这种情况下忘了析构而造成的?
      

  6.   

    对于托管代码
    推荐使用Dispose,不使用Finalize
    你只要让类实现IDisposable接口就可以了