高分,高分,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里面一般是重新创建,但已经不是原先那个了
真是有些晕,请高手说说。
===========“弱引用”并不常用,没有完全明白也没什么要紧~