Tag: 弱引用

我可以创建List <WeakReference >吗?

我正在尝试使用4.5generics实现创建一个WeakReference列表,以便我可以避免类型检查和WeakReference目标的转换。 但是, WeakReference似乎不支持协方差,所以我试图建立一个解决方法。 我认为它应该是可行的,因为每个T都是特定inheritance链中的一种类型。 那么,我在想的就是这样: public class Animal { } public class Tiger : Animal { } public class Wolf : Animal { } var mylist = new List<WeakReference>(); mylist.Add(new WeakReference(new Animal())); mylist.Add(new WeakReference(new Tiger())); mylist.Add(new WeakReference(new Wolf())); 我已经尝试为WeakReference创建一个包装类(因为它是不可inheritance的),但这不起作用。 无论如何,列表将不接受除WeakReference之外的任何类型的WeakReference 。 我可以创建自己的通用WeakReference实现,但这似乎是打败了这一点,因为我在其中进行类型转换。 我找不到任何文档,但我有点假设框架版本更好地处理这个问题。 还有另一种方法可以解决这个问题,我没想到,或者我是在咆哮错误的树?

C#:收集WeakReference之前的通知?

在C#/ .NET中,有没有办法在弱引用指向的对象被破坏之前获得通知? 基本上,我想允许收集一个对象,但在对象被销毁之前做一些事情,而不修改代码来添加析构函数(因为我不知道究竟什么类型的对象将被我的代码起诉)。 谢谢,罗伯特

WeakReference了解

我想创建所有ViewModel的字典。 public static Dictionary vmCollection = new Dictionary(); 像这样添加它 vmCollection.Add(name, new WeakReference(viewModel)); 并调用这样的必需方法.. ((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message); 我是否需要将其维护为WeakReference ? 如果我不将它作为WeakReference维护,可能会产生什么后果。

当对象完成但尚未收集垃圾时的弱参照行为

这是关于在C#/ .NET中进行对象最终化和集合的学术问题。 背景阅读是C#语言规范自动内存管理的第3.9节。 当没有对对象的显式引用时,它可能变为垃圾回收。 它变得“有资格进行破坏”。 在将来的某个时刻(例如,如果强制进行垃圾收集),将运行对象的析构函数。 在析构函数中,如果保存对该对象的引用,该对象将被最终确定,但不符合收集条件。 这可能导致对象处于已完成但尚未收集的状态。 规范的第3.9节就是一个例子。 此时,该对象仍然存在,因为它尚未被垃圾收集。 但是,引用该对象的WeakReference报告IsAlive值为false,表示该对象已被收集。 核心问题是 – IsAlive属性真正报道的是什么? 我们知道我们不能信任此属性的值true,因为在读取之后该值很快就会变为false。 但是false值是值得信赖的,并且意味着(根据文档)表明该对象已被垃圾收集。 那么在这种情况下IsAlive属性告诉我们什么呢? 不严格对象是否被垃圾收集,因为我们认为对象处于最终但未收集的状态。 这是一个显示行为的示例。 public class Dog { public static Dog KeepDogRef; public string Name { get; set; } public Dog(string name) { Name = name; } ~Dog() { Console.WriteLine(“Dog destructor for ” + Name + ” called”); Dog.KeepDogRef = […]

测试/validationWeakReference

我想validation设置WeakReference代码是否意外地保存了对引用对象的强引用。 (这是一个很容易意外地做到这一点的例子。) 这看起来是检查无意中强引用的最佳方法吗? TestObject testObj = new TestObject(); WeakReference wr = new WeakReference(testObj); // Verify that the WeakReference actually points to the intended object instance. Assert.Equals(wr.Target, testObject); // Force disposal of testObj; testObj = null; GC.Collect(); // If no strong references are left to the wr.Target, wr.IsAlive will return false. Assert.False(wr.IsAlive);

One Liner:WeakReference-to-a Lambda事件处理程序

除了多次使用它会违反DRY原则这个事实之外,你能否看到这种单线的缺点? 这似乎很简单但事实上我还没有看到其他人提出这个问题让我想知道它是否有缺点。 这段代码创建一个方法的WeakReference ,然后注册一个调用引用目标的事件处理程序。 SomeEvent += (sender, e) => ((Action)(new WeakReference((Action)ProcessEvent)).Target)(); 谢谢, 本

在.NET中集合中的WeakReferences的最佳时间

我有一个集合(我正在写一个弱字典 ),我需要定期剔除死的WeakReferences。 我经常看到的是检查添加和删除方法,即“在对集合进行X修改之后,是时候剔除了”。 这对我来说是可以接受的,但似乎应该有更好的方法。 我真的很想知道GC何时运行并立即运行我的清理代码。 毕竟,GC可能是确定何时是清理死引用的好时机的最佳机制。 我发现垃圾收集通知 ,但看起来这不是我想要的。 我不想生成一个单独的线程来监视GC。 理想情况下,我的集合将实现IWantToRunCodeDuringGC或订阅System.GC.Collected事件。 但.NET框架可能无法信任用户代码在GC期间运行… 或者也许还有另一种我忽视的方法。 编辑:如果我的代码在GC之后,之前或期间运行,我认为这并不重要。

压缩WeakReference词典

我有一个带有属性Id的 Foo类。 我的目标是在同一时间没有两个具有相同Id的Foo实例。 所以我创建了一个工厂方法CreateFoo ,它使用缓存来为同一个Id返回相同的实例。 static Foo CreateFoo(int id) { Foo foo; if (!cache.TryGetValue(id, out foo)) { foo = new Foo(id); foo.Initialize(…); cache.Put(id, foo); } return foo; } 缓存实现为Dictionary ,基于@JaredPar的Building a WeakReference Hashtable : class WeakDictionary where TValue : class { private readonly Dictionary items; public WeakDictionary() { this.items = new Dictionary(); } public void […]

尽管仍然强烈引用,C#WeakReference对象在终结器中为NULL

嗨,我在这里有代码,我不明白为什么我会遇到断点(见评论)。 这是微软的一些我不知道或我不理解的错误吗? 代码在Debug中测试过,但我认为它不会改变任何东西。 注意:您可以直接在控制台应用程序中测试代码。 只是为了信息…在超级猫的回答之后,我用提出的解决方案修复了我的代码并且它工作得很好:-) !!! 糟糕的是静态字典的使用和它的性能,但它的工作原理。 ……几分钟后,我意识到SuperCat给了我更好的提示,解决静态字典并且我做了。 代码示例如下: 代码有bug 代码已更正但具有静态ConditionalWeakTable 包含SuperCat技巧的ConditioalWeakTable代码(非常感谢他!) 样本… using System; using System.Collections.Generic; using System.Diagnostics; namespace WeakrefBug { // ********************************************************************** class B : IDisposable { public static List AllBs = new List(); public B() { AllBs.Add(this); } private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual […]

为什么C#中的事件实现默认情况下不使用弱事件模式?

这个问题可能导致猜测性答案,但我认为在c#中实现event背后有一个深思熟虑的设计决策。 只要事件的发布者处于活动状态, c#中的事件模式就会使订阅者保持活动状态。 因此,如果你没有取消订阅,你就会泄漏内存(好吧,并没有真正泄漏 – 但内存仍然不必要地占用)。 如果我想阻止这种情况,我可以取消订阅事件或实现MSDN中提出的弱事件模式。 由于事件模式导致了很多问题(对于初学者?),问题是:为什么决定发布者保留对订阅者的强引用,而不是让它们独立或允许开发人员明确地拥有strong或weak修饰符? 关于这个主题已经有几个问题了,答案听起来很合理,但没有一个真正回答为什么会这样。