有人能解释 C# 中不同类型引用的主要优点吗?
- 弱引用
- 软引用
- 幻影引用
- 强引用。
我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域。
有人能解释 C# 中不同类型引用的主要优点吗?
我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域。
Soft和phantom references出自Java,我相信。 在C#中,长弱引用(向WeakReference构造函数传递true)可能被认为类似于Java的PhantomReference。 如果有类似于SoftReference的C#内容,我不知道它是什么。
弱引用并不延长对象的生命周期,因此一旦所有强引用超出范围,它就可以进行垃圾回收。 它们可用于持有大型且初始化成本高昂的对象,但如果它们未被积极使用,则应该可供垃圾回收。
是否使用弱引用有助于减少应用程序的内存消耗将完全取决于应用程序的具体情况。 例如,如果您拥有适度数量的缓存对象,并且这些对象将来可能或可能不会被重用,弱引用可以帮助提高缓存的内存消耗。 但是,如果应用程序正在处理大量小对象,弱引用会使问题变得更糟,因为引用对象将占用同样多或更多的内存。
MSDN提供了关于弱引用的良好解释。其关键引述在底部,其中指出:
避免将弱引用用作自动解决内存管理问题的方案。 相反,开发一个有效的缓存策略来处理应用程序对象。
每次我在现实中看到WeakReference时,它都被用作自动解决内存管理问题的方案。 对于您的应用程序问题,可能有更好的解决方案。
在Android开发教程中,通过弱引用的实际案例很好地解释了这个问题。
视图上有一张图片(Bitmap)和一个图片容器(ImageView)。如果从内存之外的位置(例如磁盘、网络)加载图片,则可能会锁定UI线程和屏幕。为了避免这种情况,可以使用异步任务。
问题出现在异步任务完成时。此时,图片容器可能已经没有用处了(屏幕已经改变或者Android在滚动后卸载了不可见的部分)。弱引用可以帮助解决这个问题,并且ImageView将被垃圾回收。
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
附注:示例是用Java编写的,但C#开发人员也可以理解。
来源:http://developersdev.blogspot.ru/2014/01/weakreference-example.html