【发布时间】:2011-12-07 01:02:53
【问题描述】:
基本的区别是弱引用应该在每次运行 GC 时声明(保持低内存占用),而软引用应该保留在内存中,直到 GC 实际需要内存(它们试图延长生命周期但可能随时失败,这对于例如缓存非常有用,尤其是相当昂贵的对象)。
据我所知,对于弱引用如何影响 .NET 中对象的生命周期,没有明确的说明。如果它们是真正的弱引用,那么它们根本不应该影响它,但这也会使它们对它们的缓存主要目的毫无用处(我认为我错了吗?)。另一方面,如果他们表现得像软引用,他们的名字就会有点误导。
就我个人而言,我认为它们的行为类似于软引用,但这只是一种印象,没有根据。
当然,实施细节也适用。我在问与.NET 的弱引用相关的心态——它们是否能够延长生命周期,或者它们的行为是否像真正的弱引用?
(尽管有很多相关问题,但我还没有找到这个特定问题的答案。)
【问题讨论】:
-
除了调用 GC.Collect() 之外,我从未听说过您可以对 GC 回收对象的确切时间产生任何影响。从这个角度来看,弱引用唯一声明的是对象是可回收的。
-
@flq:例如,在 Java 中,可以通过选择软引用或弱引用来实现。 Soft 基本上的意思是“我不介意这是否被声明,但请尽量保留它”。
-
你不是在 C# 中应用 Java 范式吗,在 C# 中,通常弱引用只是对 GC 随时可以收集的东西的引用。
-
@BenRobinson:应该仍然可以区分。除非他们明确希望在这件事上保持模棱两可(这是完全可能的)。
-
@CodeInChaos:我从迄今为止阅读的有关该主题的资料中获得了这种印象,主要是 MSDN。这些示例往往显示了更可取的情况是软行为而不是弱行为。
标签: c# .net garbage-collection weak-references soft-references