自处理事件是否会阻止实例被垃圾回收?

roc*_*eye 3 .net c# events garbage-collection mvvm

我读了问题的答案.事件处理程序是否阻止了垃圾收集的发生?,但是当发布者成为目标时会发生什么?

更具体地说,我正在为WPF应用程序使用MVVM设计.Model-View类会在每次更改时引发NotifyPropertyChanged.在某些类中,我需要在修改某些内容时调用方法.

我想这样做:

this.PropertyChanged += this.MyHandler;
Run Code Online (Sandbox Code Playgroud)

这个实例会被GC破坏吗?

Ree*_*sey 8

GC查看并查看对象的任何引用当前是否以应用程序为根.它足够聪明,可以像上面那样处理循环引用.

此外,它足够聪明,可以处理你有两个对象A和B的情况,以及:

A.Event += B.Handler; 
B.Event += A.Handler;
Run Code Online (Sandbox Code Playgroud)

如果A和B都超出范围,GC就足够聪明地找到并清除这两个对象,即使它们相互订阅.但是,如果一个单独的对象(在使用中)引用任何一个,它将阻止两者被收集.

与参考计数解决方案相比,这是真正的GC解决方案的主要优势之一.引用计数将无法收集此信息,但.NET gc将完美地处理它.