强引用和弱引用

强引用是指向内存申请一段存储空间,进行存储的引用类型的对象的引用,如下创建一个强引用,

object obj = new object();
obj = 10;

在对象获得的分配内存空间中不仅仅存放了对象的信息,还存放着该对象被引用的次数。在创建一个强引用时,默认的引用次数为 1,之后每引用一次加 1,

object obj1 = obj;

此时,对象 obj 的引用次数为 2。相反,对对象进行弱引用并不会增加对象的引用次数,下面声明一个对 obj 的弱引用,

WeakReference wr = new WeakReference(obj);

在对象 obj 被回收之前,弱引用始终可以访问 obj,即弱引用允许应用程序访问对象,同时也允许垃圾回收器回收相应的对象。占用大量内存,但通过垃圾回收功能回收以后很容易重新创建的对象特别适合使用弱引用。使用弱引用对象的方法如下所示,

Object obj = new Object();
obj = 10;
WeakReference wr = new WeakReference(obj);
obj = null;
Object newobj = wr.Target; // 先引用,后判断,防止此时回收
if (newobj == null) // 判断是否被回收
{
    Console.WriteLine("null");
}
else
{
    Console.WriteLine(newobj);
}
Console.WriteLine(wr.IsAlive);

其中,IsAlive属性是判断此弱引用对象所引用的对象是否还存在;Target属性是设置该弱引用对象所引用的数据对象的值。

WeakReference类型提供了两个构造函数:

WeakReference(object target);
WeakReference(object target, bool trackResurrection);

target参数是弱引用要跟踪的对象。trackResurrection参数表示当对象的Finalize方法执行之后是否还要跟踪这个对象。默认这个参数是false。不跟踪复活对象的弱引用称为“短弱引用”;而要跟踪复活对象的的弱引用称为“长弱引用”。如果对象没有实现Finalize方法,那么长弱引用和短弱引用是完全一样的。应该尽量避免使用长弱引用,长弱引用允许使用复活的对象,而复活对象的行为可能是不可以预知的。

原文地址:https://www.cnblogs.com/jizhiqiliao/p/9946949.html