【问题标题】:Does WeakReference work with String?WeakReference 是否适用于字符串?
【发布时间】:2009-09-17 12:45:16
【问题描述】:

在 .NET 3.5 中,WeakReference 是否与 String 一起使用,或者我应该将它包装在一个小“类”中以使其与它一起使用?

【问题讨论】:

    标签: .net string weak-references


    【解决方案1】:

    System.String(C# 中的string)是一个引用类型,所以它没有理由不能完美地与WeakReference 一起工作。忽略它在某些方面是一种特殊的引用类型(首先是不可变的)这一事实 - CLR 将其视为引用类型。

    说到这一点,this other StackOverflow thread 提出了一个很好的观点,即字符串引用可以在许多情况下被“滞留”,因此没有观察到与垃圾收集有关的“预期”行为。

    【讨论】:

    【解决方案2】:

    这肯定会与 WeakReference 一起使用而不会出现任何问题,因为 System.String 是一个简单的引用类型。看到您使用 Wea​​kReference 的用例会很有趣,因为它似乎不适合 WeakReference 的“正常”用途。

    来自MSDN Guidelines

    仅在必要时使用长弱引用,因为对象的状态在完成后是不可预测的。

    避免对小对象使用弱引用,因为指针本身可能一样大或更大。

    避免使用弱引用作为内存管理问题的自动解决方案。相反,应制定有效的缓存策略来处理应用程序的对象。

    【讨论】:

    • 我的情况是我有这么多字符串,通常它们存储在数据库中,我只想在内存不足时释放它们。其实更好的缓存会更好,但是我找不到任何在内存不足时释放缓存的好方法。
    • 我希望垃圾收集器能够按预期工作并在应用程序运行时清理对字符串的引用(除非被实习)。如果你没有看到这些被收集,我猜你要么持有参考资料,要么正在拦截字符串。
    【解决方案3】:

    使用弱引用来指向一个深度不可变的对象通常没有多大意义,尤其是一个不引用任何其他对象的对象。如果数据是有用的,你应该持有一个强有力的参考。如果它没有用,你不应该持有任何参考。 WeakReference 的使用仅在弱引用对象的有用性取决于强引用的存在的情况下才真正合适。最常见的这种情况是使用弱引用将信息放入将通过强引用读取的对象中。如果没有人会阅读放入对象中的信息,那么作者就没有理由再费心了。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多