日期:2014-05-18  浏览次数:20373 次

高分,高分,100分,学了两个月了,才知道有“弱引用”这个东东,练习时,遇到不明白的地方,请您指点一个。
在CSDN昨天的帖子上看的

弱引用的使用
A   =   B,我们称这样的引用叫做强引用,GC就是通过检查强引用来决定一个对象是否是可以回收的。另外还有一种引用称作弱引用(WeakReference),这种引用不影响GC回收,这就是它的用处所在。你会问到底有什么用处。现在我们来假设我们有一个很胖的对象,也就是说它占用很多内存。我们用过了这个对象,打算将它的引用去掉好让GC可以回收内存,但是功夫不大我们又需要这个对象了,没办法,重新创建实例,怎么创建这么慢啊?有什么办法解决这样的问题?有,将对象留在内存中不就快了嘛!不过我们不想这样胖得对象总占着内存,而我们也不想总是创建这样胖的新实例,因为这样很耗时。那怎么办……?聪明的朋友一定已经猜到了我要说解决方法是弱引用。不错,就是它。我们可以创建一个这个胖对象的弱引用,这样在内存不够时GC可以回收,不影响内存使用,而在没有被GC回收前我们还可以再次利用该对象。这里有一个示例:
[C#]
public   class   Fat   {
    public   int   Data;

    public   Fat(int   data)   {
        this.Data   =   data;
    }
}

public   class   Main   {
    public   static   void   Main()   {
        Fat   oFat   =   new   Fat(1);
        WeakReference   oFatRef   =   new   WeakReference(oFat);
        //   从这里开始,Fat对象可以被回收了。
        oFat   =   null;
        if   (oFatRef.IsAlive)   {//##这个IsAlive总是为false不知道为什么
            Console.WriteLine(((Fat)   oFatRef.Target).Data);   //   1
        }
        else
        {
                    //##这里我该写些什么呢??
          }
        //   强制回收。
        GC.Collect();
        Console.WriteLine(oFatRef.IsAlive);   //   False
        Console.ReadLine();
    }
}

由于,说的不是太明白,如果您不太懂可以,回贴,我再说一下。

------解决方案--------------------
up
------解决方案--------------------
up~~~up~~
------解决方案--------------------
.net是托管代码,所以系统会自动去完成对象的回收。
------解决方案--------------------
靠GC回收的时间是不定期的,这样捕获不到
------解决方案--------------------
oFatRef.IsAlive为true 说明被回收了,可是我没有写GC.Collect()啊,并且是调试时用的,内
===========GC是自动管理的,没有写GC.Collect()不代表就不会回收

存资源也不可能急张啊??怎么就回收了呢??
===========这只是个例子,这个对象并不是“肥”的那种,内存资源怎么可能有明显变化?


如果真是回收了,else里面,是不是可以这样呢?Fat oFat = new Fat(9);//如果可以,那么这个oFat 还是原来那个oFat 嘛??
===========是,else里面一般是重新创建,但已经不是原先那个了

真是有些晕,请高手说说。
===========“弱引用”并不常用,没有完全明白也没什么要紧~