c# - 什么时候应该使用弱引用?

标签 c# java weak-references

我最近遇到了一段带有 WeakReferences 的 Java 代码——我从未见过它们被部署,尽管我在引入它们时遇到过它们。这是应该常规使用的东西还是仅在遇到内存问题时使用?如果是后者,它们是否可以轻松改造或代码是否需要认真重构?一般的 Java(或 C#)程序员通常可以忽略它们吗?

编辑过度热情地使用 WR 会造成任何损害吗?

最佳答案

弱引用都是关于垃圾回收的。一个标准对象在所有对它的引用被切断之前不会“消失”,这意味着您的各种对象对它的所有引用必须在垃圾收集将其视为垃圾之前被删除。

仅仅因为您的对象被其他对象引用而使用弱引用并不一定意味着它不是垃圾。它仍然可以被 GC 拾取并从内存中删除。

一个例子:如果我的应用程序中有一堆 Foo 对象,我可能想使用一个 Set 来保留我周围所有 Foo 的中央记录。但是,当我的应用程序的其他部分通过删除对它的所有引用来删除 Foo 对象时,我不希望我的 Set 保留对该对象的剩余引用以防止它被垃圾收集!真的,我只是想让它从我的场景中消失。在这里您可以使用类似 Weak Set(Java 有 WeakHashMap)之类的东西,它使用对其成员的弱引用而不是“强”引用。

如果您的对象没有在您希望的时候被垃圾回收,那么您在记账时犯了一个错误,某些东西仍然持有您忘记删除的引用。使用弱引用可以减轻这种簿记的痛苦,因为您不必担心它们使对象保持“Activity ”状态并且不会被垃圾收集,但您必须使用他们。

关于c# - 什么时候应该使用弱引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1640889/

相关文章:

c# - .NET 中的 SetForegroundWindow 问题

c# - 如何在 C# 中将输出格式化为两位小数和 '$' 符号?

java - 查找算术级数中缺失的项 -

c# - 为什么两个程序集中的相同 COM 引用可能会在生成时导致 CS1502 和 CS1503 错误?

Java 8 嵌套 lambda 函数查找特定键的总和

java - 将 AWT 图像转换为 SVG 图像

ios - IBOutlet 和其他的弱或强

c# - 我可以创建一个 List<WeakReference<T>> 吗?

java - Java中有SoftHashMap吗?

c# - 如何使用 OnPropertyChanged() 对 setter 进行单元测试;在里面?