有人可以举一些在.net项目中使用弱引用的例子吗?
答案 0 :(得分:4)
考虑2级缓存。所以第一级中的对象用普通引用引用,然后在第二级引用弱引用。因此,如果你想让你的对象从第一级到期,你可以把它放在第二级。
下次,当客户端尝试访问此对象时,如果有足够的内存对象将从第二级升级,但是如果内存不足并且收集了对象,则必须重新创建对象。有时会从昂贵的商店重新创建或检索,但在某些情况下,您可以在第二级找到它。
答案 1 :(得分:3)
一种情况是您希望对象具有单例行为,但您不希望它通过长期引用永久保留。例如:
class ExpensiveSingleton
{
private static WeakReference _instanceWeakRef;
private ExpensiveSingleton() { ... your expensive ctor ... }
public static ExpensiveSingleton Instance
{
get
{
ExpensiveSingleton reference = null;
if(_instanceWeakRef != null)
reference = _instanceWeakRef.Target as ExpensiveSingleton; // Try a cheap access
if(reference == null)
{
reference = new ExpensiveSingleton(...); // Pay the cost
_instanceWeakRef = new WeakReference(newInstance);
}
return reference;
}
}
}
(为简洁起见,这不是线程安全的)
这确保您获取到该对象的所有强引用都是同一个对象,并且当所有强引用都消失时,最终将收集该对象。
答案 2 :(得分:1)
在msdn页面中有一个很好的例子WeakReference,一个实现缓存的示例代码。
答案 3 :(得分:1)
一些好文章:
http://www.switchonthecode.com/tutorials/csharp-tutorial-weak-references
http://www.dotnetperls.com/weakreference
http://www.codeproject.com/KB/dotnet/WeakReference.aspx
使用它们的最大胜利之一是事件订阅。也适用于对象缓存。
答案 4 :(得分:1)