一直想找到.NET是如何让程序员像C++ 的delete一样释放对象的,这对大型程序很重要,毕竟不能把什么都指望框架去做,而且实际应用中已经发现多文档程序仅靠系统自动收集垃圾会出现很多不好的特性。
    一个解决方案是弱引用,但一来比较麻烦,而来本人还没有弄透彻。下面介绍一种比较简单的方法.(通过一个Console App演示)
    假设您的主函数需要创建一BigData类的对象,然后使用,加入一个ArrayList 之后首先从ArrayList对象清除,随后释放该对象。
 class Program
    
{
        
static void Main(string[] args)
        
{
            BigData bd 
= new BigData();
            ArrayList arr 
= new ArrayList();
            arr.Add(bd);
            ((BigData)arr[
0]).Test();
            Console.Write(
"BigData object should be released before this point");
        }

    }

    
class BigData
    
{
        
~BigData()
        
{
            Console.WriteLine(
"Destory");
        }

        
public BigData()
        
{
            
this.mi = new int[10000000];
        }

        
public void Test()
        
{
            Console.WriteLine(
"Test");
        }

        
int[] mi;
    }


   由于所有变量均为托管对象,因此释放以前首先要释放强引用(任何直接声明的变量都算强引用)因此在BigData加入mi = null;这是.NET托管应用程序释放内存特有的方式,修改析构函数如下.       
        

 ~BigData()
 
{
     mi 
= null;
     Console.WriteLine(
"Destory");
 }

 另外在主函数将bd对象交给托管堆(释放强引用)bd = null;清空队列arr.Clear();然后强制系统垃圾回收,可以施加内存压力,也可以直接调用GC.Collect()主函数如下:
 

static void Main(string[] args)
{
            BigData bd 
= new BigData();
            ArrayList arr 
= new ArrayList();
            arr.Add(bd);
            bd 
= null;
            ((BigData)arr[
0]).Test();
            arr.Clear();
            GC.Collect();
            Console.Write(
"BigData object should be released before this point");
}


     然后调用主函数您一会定发现情况略微改善,应用程序在正确的时刻调用了析构函数。然而,内存的使用量并没有变化,换句话,mi对象交由系统托管后并没有从托管堆上被真正释放。
    这是因为在主函数调用GC.Collect仅仅保证bd对象被释放,而bd对象内部包含的mi对象没有被释放,依然在托管堆上有系统认为合适的时候在释放,这个道理我几年都没有悟出来。
因此您需要在BigData的析构函数中调用一次GC.Collect()
修改后的BigData类如下

class BigData
    
{
        
~BigData()
        
{
            mi 
= null;
            GC.Collect();
            Console.WriteLine(
"Destory");
        }

        
public BigData()
        
{
            
this.mi = new int[10000000];
        }

        
public void Test()
        
{
            Console.WriteLine(
"Test");
        }

        
int[] mi;
    }


    现在您再用任务管理器单步调试并查看内存可以发现在期望的时刻对象被释放并且内存被释放了。