Tag: weak references

符合条件的C#编译器是否可以优化本地(但未使用)变量(如果它是对象的唯一强引用)?

另请参阅以下相关资源: .NET垃圾收集器是否执行代码的预测分析? (在Stack Overflow上) WP7:GC何时将局部变量视为垃圾 (MSDN上的博客文章) 换一种说法: 可以在变量超出范围之前回收局部变量引用的对象(例如,因为变量已分配,但之后不再使用),或者该变量在变量退出之前保证不符合垃圾收集条件。范围? 让我解释: void Case_1() { var weakRef = new WeakReference(new object()); GC.Collect(); // <– doesn't have to be an explicit call; just assume that // garbage collection would occur at this point. if (weakRef.IsAlive) … } 在这个代码示例中,我显然必须计划垃圾收集器回收新object的可能性; 因此if语句。 (请注意,我使用weakRef的唯一目的是检查新object是否仍然存在。) void Case_2() { var unusedLocalVar = new object(); var […]

创建对IObservable的弱订阅

我想要做的是确保如果对我的观察者的唯一引用是可观察的,它会被垃圾收集并停止接收消息。 假设我有一个带有列表框的控件,名为Messages,后面是这个代码: //Short lived display of messages (only while the user’s viewing incoming messages) public partial class MessageDisplay : UserControl { public MessageDisplay() { InitializeComponent(); MySource.IncomingMessages.Subscribe(m => Messages.Items.Add(m)); } } 哪个连接到此来源: //Long lived location for message store static class MySource { public readonly static IObservable IncomingMessages = new ReplaySubject; } 我不想要的是让消息显示器在不再可见后很长时间内保存在内存中。 理想情况下,我想要一点延伸,所以我可以写: MySource.IncomingMessages.ToWeakObservable().Subscribe(m => Messages.Items.Add(m)); […]

Mono上奇怪的WeakReference行为

使用Mono 2.11.3(SGen)以及稳定的2.10.8版本,使用WeakReference的测试代码失败了。 在像这样的简单代码中 object obj = new object(); WeakReference wr = new WeakReference(obj); Assert.IsTrue(wr.IsAlive); obj = null; GC.Collect(); Assert.IsFalse(wr.IsAlive); 第二个断言将失败。 添加GC.WaitForPendingFinalizers没有帮助。 这是Mono或我头脑中的错误吗? 谢谢

为什么.NET没有像Soft一样的SoftReference和WeakReference?

我真的很喜欢WeakReference的。 但我希望有一种方法可以告诉CLR多少(比如,在1到5的范围内)你认为参考的程度有多弱。 那将是辉煌的。 Java有SoftReference,WeakReference,我相信第三种类型称为“幻像引用”。 这就是那里的3个级别,GC在决定该对象是否获得切割时具有不同的行为算法。 我正在考虑对.NET的WeakReference进行子类化(幸运的是,并且稍微有点不好意思,它没有密封)来创建一个基于到期计时器或其他东西的伪SoftReference。